Wie kann ich sagen, welche Klasse von vielen (die alle den gleichen Job machen) schneller ausgeführt wird? Gibt es eine Software, um das zu messen?
Wie kann ich sagen, welche Klasse von vielen (die alle den gleichen Job machen) schneller ausgeführt wird? Gibt es eine Software, um das zu messen?
Antworten:
Sie haben (mindestens) zwei Lösungen:
Der ziemlich "naive" verwendet Microtime (true) vor und nach einem Teil des Codes, um zu ermitteln, wie viel Zeit während seiner Ausführung vergangen ist. Andere Antworten sagten das und gaben bereits Beispiele, so dass ich nicht viel mehr sagen werde.
Dies ist eine gute Lösung, wenn Sie ein paar Anweisungen vergleichen möchten. Zum Beispiel zwei Arten von Funktionen vergleichen - es ist besser, wenn dies tausende Male durchgeführt wird, um sicherzustellen, dass jedes "störende Element" gemittelt wird.
So etwas also, wenn Sie wissen möchten, wie lange es dauert, ein Array zu serialisieren:
$before = microtime(true);
for ($i=0 ; $i<100000 ; $i++) {
serialize($list);
}
$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";
Nicht perfekt, aber nützlich, und die Einrichtung dauert nicht lange.
Die andere Lösung, die sehr gut funktioniert, wenn Sie herausfinden möchten, welche Funktion in einem gesamten Skript viel Zeit in Anspruch nimmt, ist folgende:
Um Profildateien zu erhalten, müssen Sie Xdebug installieren und konfigurieren. Schauen Sie sich die Seite Profiling PHP Scripts in der Dokumentation an.
Im Allgemeinen aktiviere ich den Profiler nicht standardmäßig (er generiert ziemlich große Dateien und verlangsamt die Arbeit) , sondern nutze die Möglichkeit, einen XDEBUG_PROFILE
als GET-Daten bezeichneten Parameter zu senden , um die Profilerstellung nur für die von mir benötigte Seite zu aktivieren.
Der profilierungsbezogene Teil meiner php.ini sieht folgendermaßen aus:
xdebug.profiler_enable = 0 ; Profiling not activated by default
xdebug.profiler_enable_trigger = 1 ; Profiling activated when requested by the GET parameter
xdebug.profiler_output_dir = /tmp/ouput_directory
xdebug.profiler_output_name = files_names
(Weitere Informationen finden Sie in der Dokumentation.)
Dieser Screenshot stammt aus einem C ++ - Programm in KcacheGrind: (Quelle: sourceforge.net ) Mit PHP-Skripten erhalten Sie genau das Gleiche
;-) (Mit KCacheGrind meine ich; WinCacheGrind ist nicht so gut wie KCacheGrind ... )
Auf diese Weise erhalten Sie einen guten Überblick darüber, was in Ihrer Anwendung Zeit benötigt - und manchmal hilft es definitiv, die Funktion zu finden, die alles verlangsamt ^^
Beachten Sie, dass Xdebug die von PHP aufgewendete CPU-Zeit zählt. Wenn PHP (zum Beispiel) auf eine Antwort aus einer Datenbank wartet, funktioniert es nicht. nur warten. Xdebug wird also denken, dass die DB-Anfrage nicht viel Zeit in Anspruch nimmt!
Dies sollte auf dem SQL Server und nicht auf PHP profiliert werden, also ...
Hoffe das ist hilfreich :-)
Viel Spaß!
Für schnelle Sachen mache ich das (in PHP):
$startTime = microtime(true);
doTask(); // whatever you want to time
echo "Time: " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";
Sie können auch einen Profiler wie http://xdebug.org/ verwenden .
Ich habe eine einfache Timing-Klasse gemacht, vielleicht ist es für jemanden nützlich:
class TimingHelper {
private $start;
public function __construct() {
$this->start = microtime(true);
}
public function start() {
$this->start = microtime(true);
}
public function segs() {
return microtime(true) - $this->start;
}
public function time() {
$segs = $this->segs();
$days = floor($segs / 86400);
$segs -= $days * 86400;
$hours = floor($segs / 3600);
$segs -= $hours * 3600;
$mins = floor($segs / 60);
$segs -= $mins * 60;
$microsegs = ($segs - floor($segs)) * 1000;
$segs = floor($segs);
return
(empty($days) ? "" : $days . "d ") .
(empty($hours) ? "" : $hours . "h ") .
(empty($mins) ? "" : $mins . "m ") .
$segs . "s " .
$microsegs . "ms";
}
}
Verwenden:
$th = new TimingHelper();
<..code being mesured..>
echo $th->time();
$th->start(); // if it's the case
<..code being mesured..>
echo $th->time();
// result: 4d 17h 34m 57s 0.00095367431640625ms
echo
nicht$echo
2020 Update
Es ist viele Jahre her, seit ich diese Fragen das letzte Mal beantwortet habe, und ich dachte, dies verdient ein Update der APM-Landschaft.
Hier ist eine direkte Antwort auf Ihre Frage
Gibt es eine Software, um das zu messen?
Ja da ist. Ich frage mich, warum es noch niemand erwähnt hat. Die oben vorgeschlagenen Antworten scheinen zwar für eine schnelle Überprüfung in Ordnung zu sein, sind aber auf lange Sicht oder für ein größeres Projekt nicht skalierbar.
Verwenden Sie ein APM-Tool (Application Performance Monitoring), das genau dafür und für vieles mehr entwickelt wurde. Schauen Sie sich NewRelic, AppDynamics, Ruxit (alle haben eine kostenlose Version) an, um die Ausführungszeit, die Ressourcennutzung und den Durchsatz jeder Anwendung auf Methodenebene zu überwachen.
Wenn Sie die Leistung eines Frameworks schnell testen möchten, können Sie die Datei index.php einfügen
//at beginning
$milliseconds = round(microtime(true) * 1000);
//and at the end
echo round(microtime(true) * 1000) - $milliseconds;
Jedes Mal erhalten Sie die Ausführungszeit in Millisekunden . Weil Mikrosekunden beim Testen eines Framework-Falls nicht allzu nützlich sind.
Ich habe in letzter Zeit XHProf verwendet http://pecl.php.net/package/xhprof . Es wurde ursprünglich von Facebook entwickelt und verfügt über ein anständiges Webinterface.
Ich möchte Ihnen eine selbst erstellte Funktion mitteilen, mit der ich die Geschwindigkeit einer vorhandenen Funktion mit bis zu 10 Argumenten messen kann:
function fdump($f_name='', $f_args=array()){
$f_dump=array();
$f_result='';
$f_success=false;
$f_start=microtime();
$f_start=explode(' ', $f_start);
$f_start=$f_start[1] + $f_start[0];
if(function_exists($f_name)){
if(isset($f_args[0])&&is_array($f_args[0])){
if($f_result=$f_name($f_args)){
$f_success=true;
}
}
elseif(!isset($f_args[1])){
if($f_result=$f_name($f_args[0])){
$f_success=true;
}
}
elseif(!isset($f_args[2])){
if($f_result=$f_name($f_args[0],$f_args[1])){
$f_success=true;
}
}
elseif(!isset($f_args[3])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){
$f_success=true;
}
}
elseif(!isset($f_args[4])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){
$f_success=true;
}
}
elseif(!isset($f_args[5])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){
$f_success=true;
}
}
elseif(!isset($f_args[6])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){
$f_success=true;
}
}
elseif(!isset($f_args[7])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){
$f_success=true;
}
}
elseif(!isset($f_args[8])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){
$f_success=true;
}
}
elseif(!isset($f_args[9])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){
$f_success=true;
}
}
elseif(!isset($f_args[10])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){
$f_success=true;
}
}
}
$f_end=microtime();
$f_end=explode(' ', $f_end);
$f_end=$f_end[1] + $f_end[0];
$f_time=round(($f_end - $f_start), 4);
$f_dump['f_success']=$f_success;
$f_dump['f_time']=$f_time;
$f_dump['f_result']=$f_result;
var_dump($f_dump);exit;
//return $f_result;
}
Beispiel
function do_stuff($arg1='', $arg2=''){
return $arg1.' '.$arg2;
}
fdump('do_stuff',array('hello', 'world'));
Kehrt zurück
array(3) {
["f_success"]=>
bool(true)
["f_time"]=>
float(0) //too fast...
["f_result"]=>
string(11) "hello world"
}
Zend Studio bietet integrierte Unterstützung für die Profilerstellung mit XDebug oder ZendDebugger. Es wird Ihren Code profilieren und Ihnen genau sagen, wie lange jede Funktion gedauert hat. Es ist ein fantastisches Werkzeug, um herauszufinden, wo Ihre Engpässe liegen.
Sie können grundlegende Dinge wie das Speichern von Zeitstempeln oder microtime () vor und nach einer Operation verwenden, um die benötigte Zeit zu berechnen. Das ist einfach, aber nicht sehr genau. Vielleicht ist Xdebug eine bessere Lösung , ich habe noch nie damit gearbeitet, aber es scheint der bekannteste PHP-Debugger / Profiler zu sein, den ich finden kann.