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');
?>

Rispondi quotando