PHP  »  Articoli  »  Programmazione Php 

Gli strumenti di PHP per il benchmark delle applicazioni

di: Claudio Garau     22 Gennaio 2009

Un benchmark non è altro che un test effettuato su un'applicazione per valutarne le prestazioni, in particolare si tratta di una procedura tesa a stimare le performance di un software con particolare attenzione alla sua velocità nell'esecuzione degli scopi per cui è stato concepito; grazie al benchmark è anche possibile effettuare dei confronti tra diverse soluzioni in modo da individuare la più performante tra di esse.

Questa tipologia di test può essere utilizzata anche per valutare il funzionamento degli script PHP ed eventualmente per apportare migliorie al loro listato sulla base dei risultati ottenuti; per questo motivo, in questa breve trattazione saranno descritte delle semplici procedure per il benchmark delle applicazioni in PHP che potrebbero aiutare lo sviluppatore a scrivere codici più efficaci, puliti e veloci in sede di produzione.

Un esempio pratico di benchmark: il test di un ciclo

Come è noto i cicli sono conosciuti anche con il come di costrutti di iterazione, questo perché la loro funzione è quella di ripetere un determinato comportamento sulla base di una clausola detta condizione di terminazione del ciclo; nel caso di cicli in cui alla condizione di terminazione corrisponda un valore basso, il benchmark può essere una procedura inutile, valida solo per testare intervalli di tempo impercettibili in fase di esecuzione. Il discorso cambia nel caso in cui il ciclo richieda un alto numero di iterazioni.

Si osservino i due cicli for contenuti nei seguenti listati:

Listato 1

<?php
  # registrazione del momento iniziale del test
  $inizio_benchmark = (float) array_sum(explode(' ', microtime ()));

  # definizione di un array
  $ a = array_fill(0, 20000, "HTML.it");

  # esecuzione del ciclo
  for ($i = 1; $i <= count($a); ++$i)
  {
    echo $i."<br/>\n";
  } 

  # registrazione del momento finale del test
  $fine_benchmark = (float) array_sum(explode(' ',microtime()));
  
  # esito del benchmark
  echo "Esito in secondi: ". sprintf("%.5f", ($fine_benchmark-$inizio_benchmark));
?>

Listato 2

<?php
  $inizio_benchmark = (float) array_sum(explode(' ',microtime()));
  $a = array_fill(0, 20000, "HTML.it");
  $x=count($a);
  for ($i = 1; $i <= $x; ++$i)
  {
    echo $i."<br/>\n";
  }
  $fine_benchmark = (float) array_sum(explode(' ',microtime()));
  echo "Esito in secondi: ". sprintf("%.5f", ($fine_benchmark-$inizio_benchmark));
?>

I due codici proposti, molto simili, sono stati concepiti per lo stesso scopo e funzionano nello stesso modo tranne che per la diversa procedura con cui è stata proposta la condizione di terminazione al ciclo for.

Elencando gli elementi che accomunano le due piccole applicazioni è possibile dire che in entrambe:

  • verrà calcolato il momento iniziale del test a cui dovrà essere sottoposto lo script, questo sarà possibile grazie alla funzione microtime() che avrà il compito di restituire uno UNIX Timestamp completo di millisecondi;
  • la funzione microtime(), produrrà una stringa composta da una serie di valori separati da uno spazio che potranno essere ridotti ad elementi di un array grazie alla funzione explode(), semplicemente utilizzando lo spazio vuoto come delimitatore;
  • l'array creato tramite la funzione explode() conterrà dei valori che potranno essere sommati ottenendo il valore decimale (float) corrispondente al momento iniziale del benchmark;
  • verrà creato un array, associato alla variabile $a, per il quale grazie alla funzione array_fill() sarà possibile definire l'indice iniziale (0), il numero di valori contenuti (20.000, per un in dice numerico che andrà da 0 a 19.999) e i valori stessi (una stringa Html.it ripetuta per 20.000 volte);
  • tramite un ciclo for verrà generato un numero di iterazioni pari a quello dei valori contenuti nell'array (condizione di terminazione);
  • alla fine del ciclo di iterazione verrà memorizzato il momento finale del benchmark che sarà rilavato utilizzando una procedura identica a quella precedentemente esposta per la registrazione del momento iniziale;
  • al valore finale del benchmark verrà sottratto quello iniziale, il risultato di questa operazione sarà un intervallo di tempo espresso in secondi con 5 cifre decimali (per ottenere la massima precisione nel calcolo).

Si passi ora all'analisi delle differenze tra i due listati:

  • nel primo script il numero degli elementi che compongono l'array $a verrà contato all'interno del ciclo for (for ($i = 0; $i <= count($a); ++$i)), la funzione count() ha infatti il compito di restituire una cifra pari a tutti gli elementi presenti in un vettore;
  • anche nel secondo script verrà utilizzata la funzione count(), ma l'output di questa sarà associato come valore ad una nuova variabile ($x=count($a)) che verrà poi utilizzata come condizione di terminazione del ciclo for (for ($i = 0; $i <= $x; ++$i)).

Ma vediamo i tempi di esecuzione.

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Zend Framework

Diventate professionisti dello sviluppo Web. Zend Framework è lo...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti