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

    [benchmark] in_array vs foreach

    ciao a tutti, poichè dovevo decidere quale di questi due metodi usare ho deciso di fare un banchmark per vedere quale sistema sia il più veloce per trovare all'interno di un array una stringa.

    innanzitutto ho creato un array con 150 chiavi numeriche all'interno (da 1 a 150) dopo di che ho eseguito 1000 volte grazie ad un ciclo for le due operazioni. per cronometrare i tempi ho usato una funzione (set_timer(event name)) che uso per misurare i tempi di esecuzione. eccovi il codice eseguito:

    Codice PHP:

    $array 
    = array(118,50,8,71,15,57,59,141,126,121,41,58,52,3,86,117,81,34,110,100,47,134,40,1,82,109,128,2,6,65,84,45,140,101,136,42,7,31,147,73,17,62,146,74,115,14,10,35,9,145,150,97,95,39,83,138,32,102,16,18,61,137,13,144,36,106,111,89,108,148,70,96,63,23,76,80,124,90,49,107,29,127,44,119,85,38,53,122,149,94,79,129,21,30,64,56,103,93,19,92,28,112,120,4,125,67,78,48,55,88,133,43,66,25,37,143,46,135,72,104,60,87,91,68,77,27,113,75,12,33,11,54,51,114,142,5,26,130,105,69,20,131,22,24,98,99,123,132,116,139);
    $key 8;

    /*-----------------------------------*/
    set_timer('in_array');

    for(
    $i=0;$i<1000;$i++){
        
    $bool in_array($key$array);
    }

    set_timer('in_array');
    /*-----------------------------------*/


    /*-----------------------------------*/
    set_timer('foreach');

    for(
    $i=0;$i<1000;$i++){
        foreach(
    $array as $val){
            if(
    $val==$key) break;
        }
    }


    set_timer('foreach');
    /*-----------------------------------*/ 
    ed ecco i risultati usando come chiave di ricerca 8 che si trova all'inizio dell'array:

    main è durato 3.875 Ms.
    in_array è durato 1.351 Ms. Avviato dopo 0.036 Ms. 36.8% di main.
    foreach è durato 2.247 Ms. Avviato dopo 1.409 Ms. 61.2% di main.

    mentre invece usando $key=138 che si trova alla fine dell'array:

    main è durato 96.195 Ms.
    in_array è durato 10.196 Ms. Avviato dopo 0.035 Ms. 10.8% di main.
    foreach è durato 84.11 Ms. Avviato dopo 10.264 Ms. 89.1% di main.


    main è ovviamente il tempo di esecuzione totale

  2. #2
    Utente di HTML.it L'avatar di chris
    Registrato dal
    Sep 1999
    Messaggi
    1,568
    prevedibile, essendo in_array una funzione di php :E
    "Nei prossimi tre anni col mio governo vogliamo vincere anche il cancro, che colpisce ogni anno 250.000 italiani e riguarda quasi due milioni di nostri concittadini"

  3. #3

  4. #4
    ti cosiglio di usare while al posto del foreach dato che non copia l'array per ciclarlo in modo che perda meno tempo

    cmq ricordati sempre che in_array è si ottimo, ma ci sono delle volte nelle quali non lo puoi usare

    un'ottima alternativa è array_walk che ti permette di eseguire una tua funzione su tutte le chaivi dell'array

    per il while ...

    codice:
    for($i=0;$i<1000;$i++)
    {
      while(list(, $value) = each($array))
      {
        if ($value == searchedValue)
        {
          break;
        }
      }
    }
    nota: ovviamente i test che hai fatto sono estramente suscettibili a:
    - processore
    - memoria
    - occpupazione del processore
    - occupazione della memoria
    - software che esegue operazioni particolari o ha priorità più alte
    - sistema operativo

    ^^
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  5. #5
    ma usare array_walk per confrontare un valore con l'elemento come in questo caso è conveniente?

    cmq per quanto riguarda le differenza di prestazioni, al dilà dei tempi c'è cmq la percentuale che non penso cambi dato che il bench è stato eseguito sulla stessa macchina, no?

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.