Utilizza le funzioni all'interno di una dichiarazione di loop

0

Qual è la migliore pratica?

Questo:

for ($i = 0; $i < count($array); $i++) {
//stuff
}

Oppure, quello che faccio di solito:

$count = count($array);
for($i = 0; $i < $count; $i++) {
//stuff
}

È lo stesso con la magia dell'ottimizzazione del compilatore?

    
posta hlapointe 17.05.2013 - 23:19
fonte

4 risposte

3

Crea un profilo e guardalo da solo.

In generale , il primo campione eseguirà count() su ogni iterazione. Questo potrebbe ridurre drasticamente le prestazioni.

Ma:

  • In alcune lingue e / o in alcuni casi, i compilatori possono ottimizzarlo. Ma non ci farei affidamento, poiché la maggior parte delle volte, l'ottimizzazione di questa cosa è rischiosa.

  • La differenza di prestazioni potrebbe essere troppo scarsa da infastidire.

Ad esempio, in C #, l'utilizzo di for (var i = 0; i < collection.Count(); i++) su una raccolta lenta che colpisce un database può portare a un disastro. Nessun compilatore lo ottimizzerebbe, dal momento che non saprebbe se stai leggendo solo un database di sola lettura o se lo leggi mentre lo modifichi allo stesso tempo. Ma in tutti i casi, non dovresti usare for in un primo posto in tale contesto.

Una regola empirica:

  • Utilizza una variabile esterna a for se sai che la raccolta non cambierà quando ti trovi in un ciclo,

  • Conta il numero di elementi in for se la dimensione della raccolta può cambiare quando ti trovi in un ciclo,

  • Chiediti altre tecniche, come semplicemente iterare attraverso una raccolta fino alla fine, non sono più appropriate.

risposta data 17.05.2013 - 23:22
fonte
1

dipende dal fatto che //stuff cambi $array (cioè la lunghezza dell'array).

La prima variante è più esplicita in quanto è possibile vedere direttamente che la lunghezza dell'array è il limite del loop, potrebbe essere leggermente più lento del secondo, ma nei linguaggi interpretati questo non dovrebbe essere un problema.

    
risposta data 17.05.2013 - 23:22
fonte
1

La particolare ottimizzazione in questione è dovuta a un paio di nomi in genere il movimento di codice invariante o loop . È un'ottimizzazione piuttosto comune eseguita dai compilatori. Se sei in una lingua compilata non ti preoccupare, probabilmente si è preso cura di te. Se sei in una lingua interpretata, allora il tempo o non succede è meno certo.

    
risposta data 17.05.2013 - 23:36
fonte
1

La maggior parte delle lingue consente di inizializzare più variabili durante la dichiarazione di un'istruzione for . In tutte le lingue il componente di condizione di un'istruzione for viene valutato per ogni iterazione del ciclo. Quindi il seguente for($i=0; $i < foo(); $i++) risulterebbe nella funzione foo() chiamata in ogni iterazione. Finché foo() continua a restituire un valore superiore a $i del ciclo per continuare.

Questo è vero in C ++, C #, Java e PHP.

Ora, nell'ultimo esempio, supponiamo che la funzione foo() restituisca un valore costante, ma è computazionalmente pesante da calcolare. Pertanto, chiamare foo() per ciascuna iterazione rallenterebbe l'esecuzione del codice.

Esistono due pratiche comuni per risolvere questo problema.

$x = foo();
for($i = 0; $i < $x; $i++) {.....}

E

for($i = 0, $x = foo(); $i < $x; $i++) {....}

Preferisco il secondo perché è più facile leggere cosa fa $ x e a cosa serve.

EDIT:

Per rispondere alla domanda, se l'ottimizzazione del compilatore ha luogo. La risposta è No . Tutti i compilatori che ho visto continueranno a valutare l'istruzione di condizione di un ciclo for per ogni iterazione. Se questa condizione contiene una chiamata di funzione come count() , verrà eseguita ogni volta.

    
risposta data 18.05.2013 - 04:10
fonte

Leggi altre domande sui tag