loader

CodeIgniter: Analizziamo le performance del nostro codice

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!