spero sia chiaro dal titolo.
quale delle due maniere è più performante?
sì, è la solita domanda niubba, ma sarebbe utile capirlo.
ciao,
jack.
spero sia chiaro dal titolo.
quale delle due maniere è più performante?
sì, è la solita domanda niubba, ma sarebbe utile capirlo.
ciao,
jack.
non credo che uno sia + perfromante dell'altro, generalmente for e while (eccezion fatta x casi aprticolari) possono essere usati indifferentemente
esistono differenze di prestazioni non molto significative ... ma esistono, non ritrovo più un vecchio post dove tra esempi e considerazioni eravamo arrivati alla seguente soluzione:
per gli array a chiave numerica, la soluzione più performante e comoda è la seguente:
for($a = 0, $b = count($array); $a < $b; $a++)
comoda perchè ad un certo punto si può uscire dal for semplicemente scrivendo
$a = $b;
performante perchè si basa su una sola funzione assegnata una sola volta ad inizio ciclo
$b = count($array);
colitamente invece si vede questo:
for($a = 0; $b = count($array); $a++)
dove per ogni ciclo del for si riusa, inutilmente, la funzione count($array);
il current invece lavora a livello del puntatore interno, ma è comunque una funzione sicuramente più pesante di un solo incremento numerico di intero, $a++ per l' appunto.
Per quel che riguarda invece array con chiavi di tipo stringa $pippo['pluto'] la lotta è tra
while(list($k,$v) = each($arr))
e il più semèplice ed allo stesso tempo performante
foreach($arr as $k => $v)
il while non vince in confronto nemmeno se invece di chiave e dati estrapoliamo solo la chiave
while(list($k,) = each($arr))
poichè la funzione foreach è stata estremamente ottimizzata dall versione 4.3 in su di php.
Da considerare però che il foreach, per uscire, richiede inesorabilmente un break; il quale non è propriamente la soluzione migliore per uscire da un ciclo mentre il while può avere una sentinella booleana al fine di uscire quando vogliamo
$ok = true;
while($ok && list($k,$v) = each($arr))
if($k == 'pluto') $ok = false;
Spero di aver fatto un po' di luce![]()
sì grazie andr3a, quel thread l'avevo a suo tempo già visto, ma la domanda mi si è posta per queste 2 alternative:
for(con count ottimizzato)
{ $arr[$id] = robamia; ... break }
OPPURE
do { qui usi key($arr) e current($arr) }
while {next($arr)}
vedi, qui non si usa nemmeno count(), ma dei costrutti. mi chiedevo se come accesso all'array sono più veloci o equivalenti alle [] e se il ciclo WHILE di per sè è più lento...
edit:
resta inteso che in php5 il metodo più veloce dovrebbe essere il nuovo FOREACH con passaggio per riferimento.
no!Originariamente inviato da mdsjack
for(con count ottimizzato)
{ $arr[$id] = robamia; ... break }
for(con count ottimizzato)
{ $arr[$id] = robamia; ... $id = $totid}
il break è sporco (nasce per lo switch, si usa troppo spesso in tutt'altro contesto) e se si puo' evitare, facciamolo.
key | current = una chiamata a funzione su un do che potrebbe non dover essere eseguito, se l' arrai è vuotoOriginariamente inviato da mdsjack
OPPURE
do { qui usi key($arr) e current($arr) }
while {next($arr)}
piu'
next | current altra chiamata a funzione
il tutto su un costrutto doppio
do {} while()
questo è meno performante di un banale incremento di intero
$a++
dovremmo sfogliarci i sorgenti php ... ma so che in C non esiste una differenza percepibile tra lo scorrere un array con *array[i] o scorrerlo con *array++ la i dice al puntatore cosa leggere invece che dirgli di proseguire ... credo sia identicoOriginariamente inviato da mdsjack
vedi, qui non si usa nemmeno count(), ma dei costrutti. mi chiedevo se come accesso all'array sono più veloci o equivalenti alle [] e se il ciclo WHILE di per sè è più lento...
il foreach è il più veloce da PHP 4.3.0 se non ricordo male, soprattutto per array con chiavi di tipo stringaOriginariamente inviato da mdsjack
resta inteso che in php5 il metodo più veloce dovrebbe essere il nuovo FOREACH con passaggio per riferimento.
il foreach del php 5 è anche più veloce![]()
1) ma scusa il break non è l'istruzione generale per interrompere il ciclo... :master: in ogni caso dovrebbe diventarlo, perchè è molto più comprensibile di un intervento manuale sulla condizione del FOR, senza contare che allora come si esce dal FOREACH? e per il WHILE si deve stare a creare un flag esterno come nuova variabile... non mi pare per niente corretto.
edit: controllavo per sicurezza, http://it.php.net/manual/it/control-...ures.break.php ma effettivamente è così. tra l'altro mi stavo scordando la possibilità di dare il parametro al break per i cicli annidati.
2) ovviamente ho usato do while perchè sono sicuro che l'array è pieno. quindi questi che sono qualificati costrutti sono in realtà considerati funzioni alla pari di un count() o altro?
no, il break e' il delimitatore di uno switch case ... che viene usato in modo sporco anche per fermare i cicliOriginariamente inviato da mdsjack
1) ma scusa il break non è l'istruzione generale per interrompere il ciclo... :master:
( ho dato un esame all' uni, fammelo rimembrare)
non se sai cosa fa il for, ovvero ha una dichiarazione iniziale, una situazione di controllo ed una assegnazione .Originariamente inviato da mdsjack
in ogni caso dovrebbe diventarlo, perchè è molto più comprensibile di un intervento manuale sulla condizione del FOR
$a = 0;
$b = 10;
while($a < $b) {
// codice che vuoi
$a++;
}
questo e' un for riprodotto su while ... siccome la parte centrale e' la condizione logica, sul while sembra naturale scrivere $a = $b; al fine di non verificare più la condizione, ma dovrebbe essere altrettanto comprensibile sul for, la parte centrale è quel while.
in modo sporco, break, l'unico caso che approvo, visto che non e' possibile fare altrimenti se non passare per un while con sentinellaOriginariamente inviato da mdsjack
, senza contare che allora come si esce dal FOREACH?
si chiama sentinella e non ha nulla di insensato ... while(condizione_vera){codice}Originariamente inviato da mdsjack
e per il WHILE si deve stare a creare un flag esterno come nuova variabile... non mi pare per niente corretto.
tutto sta' a non rendere piu' la condizione vera, ti sembra cosi' terribile ?
è ammesso in php, ma non è un modo pulito di uscire da un cicloOriginariamente inviato da mdsjack
edit: controllavo per sicurezza, http://it.php.net/manual/it/control-...ures.break.php ma effettivamente è così. tra l'altro mi stavo scordando la possibilità di dare il parametro al break per i cicli annidati.
php ha un core in C ... costrutto o meno, se chiami una funzione in php , in C qualcosa si muove, e far muovere un next piuttosto che una sola volta un sizeOf dubito porti vantaggi, in compenso non è scalabile, poiche' è solo un caso che tu abbia l' array pieno, se fosse vuoto ? rischi il notice ? ... io lo evitereiOriginariamente inviato da mdsjack
2) ovviamente ho usato do while perchè sono sicuro che l'array è pieno. quindi questi che sono qualificati costrutti sono in realtà considerati funzioni alla pari di un count() o altro?![]()