2012-05-21 8 views
8

Ho un sistema basato su php che funziona perfettamente dal 2006, che ha un processo di backend (CLI, cron), che elabora milioni di record, usando una grande struttura ad albero in memoria.Perché php array si rallenta con le nuove versioni di php e come aggirarlo?

Ho notato grandi regressioni di prestazioni durante l'aggiornamento di una macchina debian.

Quindi, per cercare il problema, ho scritto un semplice script, scaricato una dozzina di versioni xampp ed eseguito lo stesso script con le diverse versioni di php.

$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"; 

corro lo stesso copione contro XAMPP 1.6.0a win32 win32 attraverso 1.7.7-VC9, con i seguenti risultati:

- 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 

Note: - Non faccio uso di XAMPP o Windows sui server, ma questo era il modo più semplice per testare contemporaneamente diverse versioni. - Ho provato a google per questo problema alcune volte, ma non ho ottenuto risultati rilevanti - La perdita di velocità è circa la stessa (runtime più lungo del 50%) sui server - Non penso che un rallentamento di questo tipo è accettabile da qualsiasi framework o compilatore, - anche a dispetto di nuove funzionalità, i vecchi dovrebbero funzionare altrettanto bene di prima. Non posso dire al mio capo, che lo stesso computer con lo stesso software non può più fare lo stesso lavoro, perché abbiamo dist-aggiornato il debian su di esso ... Sembrerebbe un aggiornamento di Windows. :)

Qualche idea?

+1

Wow solo per installare tutte le versioni di PHP che hai speso molto tempo credo. potresti testare solo 2-3 versioni – dynamic

+0

Ciclo estremamente brutto a parte, non sono del tutto sicuro del perché a parte forse una (o più) delle estensioni PHP che vengono installate con XAMMP gonfiano le prestazioni come un matto. Yikes, con la maggior parte del mio codice ho visto le cose accelerare. Il primo pensiero che viene in mente sarebbe che forse la versione più recente funzioni meglio con l'orientamento agli oggetti. – pthurmond

+0

Come diavolo hai installato tutte queste versioni? – Mustafa

risposta

4

chiamare gc_disable() prima del ciclo. Taglia il mio tempo a metà.

(php aggiunto un nuovo garbage collector in 5.3)

+0

Conosco il gc, ma non sapevo, che funziona come un freno a mano, anche se non rilascio alcun ricordo. Spegnerlo sembra una buona idea, grazie. Dovrò provare a disabilitarlo in runtime in diverse parti del codice, perché non voglio perdere troppa memoria. Vedo i runtime di PHP 5.3 scendere a circa 11 secondi sulla macchina di test, quindi è un po 'più veloce di 5.2 prima. – PetrosHu

+0

Sblocca inoltre un uovo di Pasqua della comunità su [thread github] (https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799) – Coconop