Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    For + count() + $arr[$i] VS. While + current($arr)

    spero sia chiaro dal titolo.
    quale delle due maniere è più performante?

    sì, è la solita domanda niubba, ma sarebbe utile capirlo.

    ciao,
    jack.

  2. #2
    non credo che uno sia + perfromante dell'altro, generalmente for e while (eccezion fatta x casi aprticolari) possono essere usati indifferentemente

  3. #3
    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
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    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.

  5. #5
    Originariamente inviato da mdsjack
    for(con count ottimizzato)
    { $arr[$id] = robamia; ... break }
    no!
    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.


    Originariamente inviato da mdsjack
    OPPURE

    do { qui usi key($arr) e current($arr) }
    while {next($arr)}
    key | current = una chiamata a funzione su un do che potrebbe non dover essere eseguito, se l' arrai è vuoto

    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++




    Originariamente 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...
    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 identico



    Originariamente inviato da mdsjack
    resta inteso che in php5 il metodo più veloce dovrebbe essere il nuovo FOREACH con passaggio per riferimento.
    il foreach è il più veloce da PHP 4.3.0 se non ricordo male, soprattutto per array con chiavi di tipo stringa

    il foreach del php 5 è anche più veloce
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    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?

  7. #7
    Originariamente inviato da mdsjack
    1) ma scusa il break non è l'istruzione generale per interrompere il ciclo... :master:
    no, il break e' il delimitatore di uno switch case ... che viene usato in modo sporco anche per fermare i cicli
    ( ho dato un esame all' uni, fammelo rimembrare )


    Originariamente inviato da mdsjack
    in ogni caso dovrebbe diventarlo, perchè è molto più comprensibile di un intervento manuale sulla condizione del FOR
    non se sai cosa fa il for, ovvero ha una dichiarazione iniziale, una situazione di controllo ed una assegnazione .

    $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.


    Originariamente inviato da mdsjack
    , senza contare che allora come si esce dal FOREACH?
    in modo sporco, break, l'unico caso che approvo, visto che non e' possibile fare altrimenti se non passare per un while con sentinella


    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.
    si chiama sentinella e non ha nulla di insensato ... while(condizione_vera){codice}
    tutto sta' a non rendere piu' la condizione vera, ti sembra cosi' terribile ?


    Originariamente 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.
    è ammesso in php, ma non è un modo pulito di uscire da un ciclo


    Originariamente 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?
    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 eviterei
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.