AUTORE
daniele_dll

DESCRIZIONE
Test per confrontare le performance dei principali metodi per gestire i cicli sulle liste. Il test mette a confronto il For, il Foreach e poi due strutture un po più complesse come il While/List/Each e il While/Current/Next.

CATEGORIA
PERFORMANCE/LOOPS

DIPENDENZE

CODICE
Codice PHP:
<?php

/**
 * Per prima cosa va definito il nome della classe da testare e l'elenco de
 * metodi da testare, in modo da permettere al codice presente dopo la classe
 * di automatizzare le operazioni di testing.
 * L'elenco dei metodi è composto da una lista Chiave/Valore dove la chiave
 * corrisponde al nome del metodo mentre il valore alla sua descrizione
 * Inoltre va anche definito il numero di iterazioni da eseguire
 */
$class 'LoopsValuesInAListTimeUnitTest';
$iterations 10000;
$methods = array
(
    
'TestForEach'               => 'Test di Foreach',
    
'TestFor'                   => 'Test di For',
    
'TestWhileListEach'         => 'Test di While/List/Each',
    
'TestWhileCurrentNext'      => 'Test di While/Current/Next'
);



/**
 * Qui va costruito il dato da utilizzare nei test, in questo caso un array
 * lungo diecimila elementi numerici corrispondenti al numero dell'elemento
 * senza chiave, quindi un normale array di elementi
 */
$dataToTest = array();
for(
$index 0$index 1000$index++)
{
    
$dataToTest[] = $index;
}



/**
 * Qui è presente la classe che contiene il codice per il testing. I metodi
 * statici devono sempre contenere due elementi:
 * - Le iterazioni, ovvero il numero di cicli da eseguire per test
 * - I dati da testare
 *
 * Quest'ultima variabile deve essere SEMPRE presente, ovviamente non ha
 * importanza il tipo e se non vi serve dichiaratela come NULL
 */
class LoopsValuesInAListTimeUnitTest
{
    public static function 
TestForeach($Iterations$DataToTest)
    {
        
// Inizializza le variabili
        
$duration 0;

        
// Avvia le iterazioni
        
for($iteration 0$iteration $Iterations$iteration++)
        {
            
// Acquisice l'orario dell'inizio del test
            
$startTime microtime(true);

            
// Avvia il ciclo
            
foreach($DataToTest as $value)
            {
            }

            
// Acquisice la durata
            
$duration += microtime(true) - $startTime;
        }

        
// Restituisce la durata
        
return $duration;
    }

    public static function 
TestFor($Iterations$DataToTest)
    {
        
// Inizializza le variabili
        
$duration 0;

        
// Conta gli elementi (Questo va eseguito prima del conteggio)
        
$dataToTestLenght count($DataToTest);

        
// Avvia le iterazioni
        
for($iteration 0$iteration $Iterations$iteration++)
        {
            
// Acquisice l'orario dell'inizio del test
            
$startTime microtime(true);

            
// Avvia il ciclo
            
for($index 0$index $dataToTestLenght$index++)
            {
            }

            
// Acquisice la durata
            
$duration += microtime(true) - $startTime;
        }

        
// Restituisce la durata
        
return $duration;
    }

    public static function 
TestWhileListEach($Iterations$DataToTest)
    {
        
// Inizializza le variabili
        
$duration 0;

        
// Resetta l'array
        
reset($DataToTest);

        
// Avvia le iterazioni
        
for($iteration 0$iteration $Iterations$iteration++)
        {
            
// Acquisice l'orario dell'inizio del test
            
$startTime microtime(true);

            
// Avvia il ciclo
            
while(list($key$value) = each($DataToTest))
            {
            }

            
/**
             * In questo caso va conteggiato il tempo della funzione reset
             * sull'array perché è un'operazione che in un ambiente reale
             * verrebbe sempre e comunque eseguita
             */
            
reset($DataToTest);

            
// Acquisice la durata
            
$duration += microtime(true) - $startTime;
        }

        
// Restituisce la durata
        
return $duration;
    }

    public static function 
TestWhileCurrentNext($Iterations$DataToTest)
    {
        
// Inizializza le variabili
        
$duration 0;

        
// Resetta l'array
        
reset($DataToTest);

        
// Avvia le iterazioni
        
for($iteration 0$iteration $Iterations$iteration++)
        {
            
// Acquisice l'orario dell'inizio del test
            
$startTime microtime(true);

            
// Avvia il ciclo
            
while(($value current($DataToTest)) !== false)
            {
                
// Si sposta all'elemento successivo
                
next($DataToTest);
            }

            
/**
             * In questo caso va conteggiato il tempo della funzione reset
             * sull'array perché è un'operazione che in un ambiente reale
             * verrebbe sempre e comunque eseguita
             */
            
reset($DataToTest);

            
// Acquisice la durata
            
$duration += microtime(true) - $startTime;
        }

        
// Restituisce la durata
        
return $duration;
    }
}

// Include il codice per il test
require_once('TimeUnitTesting.php');

?>