Ogni programmatore ad un certo punto dello sviluppo del codice, ha necessità di analizzare le performance della propria applicazione/funzione/metodo, infatti CodeIgniter ha una classe di gestione Benchmark sempre attiva, che consente di calcolare la differenza di tempo tra due punti distinti e contrassegnati dal programmatore.
Questa libreria “Benchmark” viene sempre avviata nel momento in cui viene invocato il framework e termina con la classe di output appena prima di inviare la vista finale al browser, consentendo di mostrare un tempismo molto accurato dell’intera esecuzione del sistema.
A cosa e a chi serve?
Come detto in precedenza un codice può funzionare in ogni situazione, ma l’ottimizzazione dell’esecuzione dello stesso non è sempre intuitiva, ed è in questo caso che la Lib arriva in supporto al Dev per analizzare le richieste e l’esecuzione del codice, permettendo così di avviare un processo di ottimizzazione.
Immaginiamo un codice di questo tipo
$this->benchmark->mark('inizio');
foreach ($data as $k=>$v){
foreach ($v as $kk=>$vv){
echo $vv.' - ';
}
echo "\r\n";
}
$this->benchmark->mark('fine');
echo $this->benchmark->elapsed_time('inizio', 'fine');
Ossia stampiamo tutti i valori di un’array multidimensionale.
In questo caso la mia macchina impiega ad elaborare la richiesta in “0.0066 ” secondi, anche se è un tempo molto basso la complessità è lineare in base al numero di items del primo e secondo array, quindi abbiamo effettivamente 2 vincoli:
- Numero di items di Data
- Numero di items in v
Per limitare le dipendenze si potrebbero sfruttare funzioni native del linguaggio con un piccolissimo accorgimento come segue:
$this->benchmark->mark('inizio');
foreach ($data as $k=>$v){
echo join(' - ',$v);
echo "\r\n";
}
$this->benchmark->mark('fine');
echo $this->benchmark->elapsed_time('inizio', 'fine');
In questo caso con lo stesso codice, stessa macchina, stessa dimensione dell’array il tempo totale d’esecuzione è ” 0.0029 ” secondi, ossia meno della metà dell’iteratività precedente.
Avviandoci verso la fine dell’articolo possiamo invocare la funzione in modo globale in questo modo:
echo $this->benchmark->elapsed_time();
Quando i parametri sono assenti, il benchmark conterà fino a quando non viene inviato l’output finale al browser. Non importa dove usi la chiamata di funzione, il timer continuerà a funzionare fino alla fine.
Arrivati a questo punto, non resta che augurarvi buon Banchmarking Code!