Mam taka klasę, taki niby-stoper. Uzywam go w ten sposób, że ustawiam sobie split-time'y np. przed i po każdym zapytaniu MySQL. Na końcu, w formie tabelki, wyświetla mi czasy wykonania poszczególnych fragmentów kodu. Bardzo łatwo wychwycić w ten sposób "wąskie gardła". Ponieważ kod nie jest zbyt rozbudowany, wklejam go tutaj.
Chcesz, to użyj, nie, to nie

Sposób użycia (przykład):
<?php
$bm = new Benchmark();
...
$bm->split('początek wykonania zapytania');
//tu klopotliwe zapytanie
...
$bm->split('koniec wykonania zapytania');
//reszta skryptu
...
//wyswietlenie tabelki z czasami
$bm->display();
?>
Kod klasy:
<?php
/**
* klasa Benchmark - stoper
*
*
* @author blooregard <bloorq@gmail.com>
*/
/**
* klasa-stoper do pomiaru czasu wykonywania skryptow
*
*/
class Benchmark {
/**
* punkty pomiaru
*
* @var unknown_type
*/
private $split_times = array();
/**
* miedzyczasy - opisy
*
* @var unknown_type
*/
private $split_desc = array();
/**
* konstruktor i zainicjowanie testu
*
* @return bm
*/
public function __construct() {
$this->split_times[] = $this->getmicrotime();
$this->split_desc[] = "start";
}//bm()
private function getmicrotime(){
return ((float)$usec + (float)$sec);
}//getmicrotime
/**
* miedzyczas - dodanie czasu wykonania i opisu
*
* @param unknown_type $opis
*/
public function split($opis) { $this->split_times[] = $this->getmicrotime();
$this->split_desc[] = $opis;
return;
}//split
/**
* zakonczenie pomiaru i wyswietlenie wynikow
*
*/
public function t_stop() {
$this->split_times[] = $this->getmicrotime();
$this->split_desc[] = "";
}
/**
* wyswietla tabelke z wynikami
*
*/
public function display() {
echo '<table style="border-colapse:collapse; font-family:verdana, helvetica, arial; font-size:10px; color:#555;" cellspacing="0" cellpadding="3"> <tr style="background-color:#eaeaea;">
<th style="width:300px; border:1px solid #d0d0d0;">punkt pomiaru</th>
<th style="width:200px; border:1px solid #d0d0d0;">bezwzględny czas wykonania</th>
<th style="width:200px; border:1px solid #d0d0d0;">czas wykonania bloku kodu</th></tr>
<tr><td style="width:300px; border:1px solid #f0f0f0;">'.$this->split_desc[0].'</td>
<td style="width:200px; border:1px solid #f0f0f0;">'.$this->split_times[0].'</td>
<td style="width:200px; border:1px solid #f0f0f0;">0.0000 sek.</td></tr>';
for($i=1; $i<(count($this->split_times)-1
); $i++) { echo '<tr><td style="width:300px; border:1px solid #f0f0f0;">'.$this->split_desc[$i].'</td> <td style="width:200px; border:1px solid #f0f0f0;">'.$this->split_times[$i].'</td>
<td style="width:200px; border:1px solid #f0f0f0;">'.sprintf("%01.4f sek.",$this->calculate_time($i)).'</td></tr>'; }//for
echo'<tr><td style="border:1px solid #f0f0f0;">stop (czas wykonania całego skryptu)</td> <td style="border:1px solid #f0f0f0;">'.$this->split_times[count($this->split_times)-1].'</td> <td style="border:1px solid #f0f0f0;">'.sprintf("%01.4f sek.",(($this->split_times[count($this->split_times)-1
])-($this->split_times[0]))).'</td></tr> </table>';
return;
}//stop
/**
* oblicza czas pomiedzy kolejnymi pomiarami
*
*/
private function calculate_time($i) {
return (($this->split_times[$i])-($this->split_times[$i-1]));
}
}//class Benchmark
?>