2012-05-21 10 views
8

Ich habe ein PHP-basiertes System funktioniert seit 2006 perfekt, die einen Back-End (CLI, Cron) -Prozess hat, verarbeitet Millionen von Datensätzen, mit einer großen baumartigen Struktur im Speicher.Warum PHP-Array mit neueren PHP-Versionen langsamer wird, und wie man das umgehen kann?

Ich habe große Leistungsregressionen beim Upgrade einer Debian-Maschine bemerkt.

Also, um das Problem zu erforschen, schrieb ich ein einfaches Skript, und heruntergeladen ein Dutzend Xampp Releases, und führen Sie das gleiche Skript mit den verschiedenen PHP-Versionen.

$start=microtime(true); 
$n=10; 
$counter=1; 
$testarray=Array(); 

for ($i[1]=0;$i[1]<$n;$i[1]++) 
    for ($i[2]=0;$i[2]<$n;$i[2]++) 
    for ($i[3]=0;$i[3]<$n;$i[3]++) 
     for ($i[4]=0;$i[4]<$n;$i[4]++) 
     for ($i[5]=0;$i[5]<$n;$i[5]++) 
      for ($i[6]=0;$i[6]<$n;$i[6]++) 
      for ($i[7]=0;$i[7]<$n;$i[7]++) 
       $testarray[$i[1]][$i[2]][$i[3]][$i[4]][$i[5]][$i[6]][$i[7]]=$counter++; 

$end=microtime(true); 
echo "PHP ".phpversion()." ".round(memory_get_peak_usage(true)/(1024*1024),2)." mbyte max ram, ".round($end-$start,2)." seconds\r\n"; 

Ich betreibe das gleiche Skript gegen XAMPP win32 1.6.0a durch win32 1.7.7-VC9, mit den folgenden Ergebnissen:

- PHP 5.2.1 890.25 mbyte max ram, 12.43 seconds 
- PHP 5.2.1 890.25 mbyte max ram, 12.37 seconds 
- PHP 5.2.2 890.25 mbyte max ram, 12.43 seconds 
- PHP 5.2.3 890.25 mbyte max ram, 12.38 seconds 
- PHP 5.2.4 890.25 mbyte max ram, 12.5 seconds 
- PHP 5.2.5 890.25 mbyte max ram, 12.28 seconds 
- PHP 5.2.5 890.25 mbyte max ram, 12.31 seconds 
- PHP 5.2.6 890.25 mbyte max ram, 12.52 seconds 
- PHP 5.2.6 890.25 mbyte max ram, 12.54 seconds 
- PHP 5.2.8 890.25 mbyte max ram, 12.72 seconds 
- PHP 5.2.9 890.25 mbyte max ram, 12.53 seconds 
- PHP 5.3.0 975.5 mbyte max ram, 18.28 seconds 
- PHP 5.3.1 975.5 mbyte max ram, 18.06 seconds 
- PHP 5.3.5 975.5 mbyte max ram, 18.49 seconds 
- PHP 5.3.8 975.5 mbyte max ram, 17.97 seconds 
- PHP 5.3.8 975.5 mbyte max ram, 18.11 seconds 

Hinweise: - Ich benutze keine xampp oder Fenster auf Servern, aber dies war der einfachste Weg, um durch verschiedene Versionen gleichzeitig zu testen. - Ich habe versucht, für dieses Problem ein paar Mal googeln, aber keine relevanten Ergebnisse - Der Geschwindigkeitsverlust ist in etwa die gleiche (50% längere Laufzeit) auf den Servern - Ich glaube nicht, dass eine Verlangsamung von diese Art ist von jedem Framework oder Compiler akzeptabel, - trotz neuer Features sollten die alten genauso gut funktionieren wie vorher. Ich kann meinem Chef nicht sagen, dass derselbe Computer mit der gleichen Software nicht mehr den gleichen Job machen kann, weil wir den Debian darauf aufdatiert haben ... Das würde aussehen wie ein Windows-Upgrade. :)

Irgendwelche Ideen?

+1

Wow einfach alle, die PHP-Versionen Sie viel Zeit ich glaube ausgegeben zu installieren. Sie könnten nur 2-3 Releases testen – dynamic

+0

Extrem hässliche Schleife beiseite, ich bin mir nicht ganz sicher, warum anders als vielleicht eine (oder mehrere) der PHP-Erweiterungen, die mit XAMMP installiert werden, die Leistung wie verrückt aufbläht. Yikes, mit dem größten Teil meines Codes habe ich gesehen, wie sich die Dinge beschleunigen. Der erste Gedanke, der Ihnen in den Sinn kommt, wäre, dass die neuere Version vielleicht besser mit der Objektorientierung funktioniert. – pthurmond

+0

Wie zur Hölle hast du all diese Releases installiert? – Mustafa

Antwort

4

Anruf gc_disable() vor der Schleife. Schneidet meine Zeit in zwei Hälften.

(PHP hat einen neuen Garbage Collector in 5.3)

+0

Ich weiß über die GC, aber ich wusste nicht, dass es wie eine Handbremse funktioniert, auch wenn ich keinen Speicher freigeben. Ausschalten scheint eine gute Idee, danke. Ich muss versuchen, es zu aktivieren deaktivieren Sie Laufzeit in verschiedenen Teilen des Codes, da ich nicht zu viel Speicher leckt. Ich sehe, dass die PHP 5.3-Laufzeiten auf dem Testgerät auf etwa 11 Sekunden fallen, also ist es ein bisschen schneller als 5.2 zuvor. – PetrosHu

+0

Es öffnet auch ein Community-Osterei auf [github thread] (https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799) – Coconop

Verwandte Themen