Prima di tutto, capisco che nel 90% delle applicazioni la differenza di prestazioni è completamente irrilevante, ma devo solo sapere qual è il costrutto più veloce. Quello e ...
Le informazioni attualmente disponibili su di loro in rete sono confuse. Molte persone dicono che foreach è un male, ma tecnicamente dovrebbe essere più veloce poiché si suppone di semplificare la scrittura di un attraversamento di array usando iteratori. Gli iteratori, che si suppone siano ancora più veloci, ma in PHP sono anche apparentemente morti lentamente (o questa non è una cosa PHP?). Sto parlando delle funzioni dell'array: next () prev () reset () ecc. Bene, se sono anche funzioni e non una di quelle caratteristiche del linguaggio PHP che sembrano funzioni.
Per restringere un po 'questo : non sono interessante attraversare array in passi di qualcosa di più di 1 (nessun passaggio negativo, cioè inversione dell'iterazione). Inoltre non mi interessa un attraversamento da e verso punti arbitrari, solo da 0 a lunghezza. Inoltre, non vedo manipolare array con più di 1000 chiavi che si verificano su base regolare, ma vedo un array attraversato più volte nella logica di un'applicazione! Anche per quanto riguarda le operazioni, in gran parte solo manipolazione ed eco delle stringhe.
Ecco alcuni siti di riferimento:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Quello che sento ovunque:
foreach
è lento e quindifor
/while
è più veloce- PHPs
foreach
copia l'array su cui scorre; per renderlo più veloce è necessario utilizzare i riferimenti - codice come questo: è più veloce di un
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Ecco il mio problema Ho scritto questo script di prova: http://pastebin.com/1ZgK07US e non importa quante volte eseguo lo script, ottengo qualcosa del genere:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
In breve:
foreach
è più veloce cheforeach
con riferimentoforeach
è più veloce difor
foreach
è più veloce difor
una tabella hash
Qualcuno può spiegare?
- Sto facendo qualcosa di sbagliato?
- PHP per ogni riferimento è davvero qualcosa che fa la differenza? Voglio dire, perché non dovrebbe copiarlo se passi per riferimento?
- Qual è il codice iteratore equivalente per l'istruzione foreach; Ne ho visti alcuni in rete, ma ogni volta che li collaudo i tempi sono lontani; Ho anche testato alcuni costrutti di iteratori semplici ma non sembra mai ottenere risultati decenti - gli iteratori di array in PHP sono semplicemente orribili?
- Ci sono modi / metodi / costrutti più veloci per iterare attraverso una matrice diversa da FOR / FOREACH (e WHILE)?
Versione PHP 5.3.0
Modifica: Risposta Con l'aiuto delle persone qui sono stato in grado di mettere insieme le risposte a tutte le domande. Li riassumo qui:
- "Sto facendo qualcosa di sbagliato?" Il consenso sembra essere: sì, non posso usare l'eco nei benchmark. Personalmente, non vedo ancora come l'eco sia una funzione con tempo di esecuzione casuale o come qualsiasi altra funzione sia in qualche modo diversa - che e la capacità di quello script di generare semplicemente gli stessi risultati di foreach meglio di tutto è difficile per spiegare però solo "stai usando l'eco" (bene cosa avrei dovuto usare). Tuttavia, concedo che il test dovrebbe essere fatto con qualcosa di meglio; sebbene non venga in mente un compromesso ideale.
- "PHP per ogni cosa di riferimento fa davvero la differenza? Voglio dire, perché non dovrebbe copiarla se passi per riferimento?" ircmaxell mostra che sì, ulteriori test sembrano dimostrare nella maggior parte dei casi che il riferimento dovrebbe essere più veloce - sebbene dato il mio frammento di codice sopra, sicuramente non significa tutto. Accetto che il problema sia probabilmente troppo non intuitivo per preoccuparsi a tale livello e richiederebbe qualcosa di estremo come la decompilazione per determinare quale sia la migliore per ogni situazione.
- "Qual è il codice iteratore equivalente per l'istruzione foreach; ne ho visti alcuni in rete ma ogni volta che li collaudo il tempismo è molto lontano; ho anche testato alcuni semplici costrutti iteratori ma sembra che non ottengano mai risultati decenti - gli iteratori di array in PHP sono semplicemente orribili? " ircmaxell ha fornito la risposta qui sotto; sebbene il codice potrebbe essere valido solo per la versione di PHP> = 5
- "Ci sono modi / metodi / costrutti più veloci per iterare attraverso una matrice diversa da FOR / FOREACH (e WHILE)?" Grazie a Gordon per la risposta. L'uso di nuovi tipi di dati in PHP5 dovrebbe fornire un aumento delle prestazioni o un aumento della memoria (uno dei due potrebbe essere desiderabile a seconda della situazione). Mentre per quanto riguarda la velocità molti dei nuovi tipi di array non sembrano migliori di array (), splpriorityqueue e splobjectstorage sembrano essere sostanzialmente più veloci. Link fornito da Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Grazie a tutti coloro che hanno cercato di aiutare.
Probabilmente continuerò a cercare (la versione non di riferimento) per qualsiasi traversata semplice.