Ich möchte wissen, wie ich meine PHP-Skripte am besten vergleichen kann. Es spielt keine Rolle, ob es sich um einen Cron-Job, eine Webseite oder einen Webdienst handelt.
Ich weiß, dass ich Microtime verwenden kann, aber gibt es mir wirklich die Echtzeit eines PHP-Skripts?
Ich möchte verschiedene Funktionen in PHP testen und vergleichen, die dasselbe tun. Zum Beispiel preg_match
vs strpos
oder domdocument
vs preg_match
oder preg_replace vs str_replace`
Beispiel einer Webseite:
<?php
// login.php
$start_time = microtime(TRUE);
session_start();
// do all my logic etc...
$end_time = microtime(TRUE);
echo $end_time - $start_time;
Dies wird ausgegeben: 0.0146126717 (variiert ständig - aber das ist der letzte, den ich bekommen habe). Dies bedeutet, dass die Ausführung des PHP-Skripts ungefähr 0,015 dauerte.
Gibt es einen besseren Weg?
Antworten:
Wenn Sie tatsächlich Code aus der realen Welt vergleichen möchten, verwenden Sie Tools wie Xdebug und XHProf .
Xdebug eignet sich hervorragend für die Arbeit mit Dev / Staging. XHProf ist ein hervorragendes Tool für die Produktion und kann dort sicher ausgeführt werden (solange Sie die Anweisungen lesen). Die Ergebnisse eines einzelnen Seitenladevorgangs sind nicht so relevant wie die Leistung Ihres Codes, während der Server dazu gebracht wird, eine Million anderer Dinge zu tun, und die Ressourcen knapp werden. Dies wirft eine andere Frage auf: Haben Sie einen Engpass bei der CPU? RAM? I / O?
Sie müssen auch über den Code hinaussehen, den Sie in Ihren Skripten ausführen, um zu sehen, wie Ihre Skripte / Seiten bereitgestellt werden. Welchen Webserver verwenden Sie? Als Beispiel kann ich nginx + PHP-FPM dazu bringen, mod_php + Apache ernsthaft auszuführen, was wiederum dazu führt, dass statische Inhalte mithilfe eines guten CDN bereitgestellt werden.
Als nächstes sollten Sie berücksichtigen, wofür Sie optimieren möchten.
Ersterem kann geholfen werden, indem beispielsweise alle an den Browser gesendeten Ressourcen komprimiert werden. Dies kann Sie jedoch (unter bestimmten Umständen) weiter vom Erreichen des letzteren abbringen.
Hoffentlich kann all dies dazu beitragen, zu zeigen, dass sorgfältig isolierte Labortests nicht die Variablen und Probleme widerspiegeln, auf die Sie in der Produktion stoßen, und dass Sie herausfinden müssen, was Ihr übergeordnetes Ziel ist und was Sie dann tun können, um dorthin zu gelangen. bevor Sie den Weg der Mikro- / Frühoptimierung zur Hölle beschreiten .
quelle
AllowOveride
dass Apache bei jeder Anforderung ganze Verzeichnisse nach .htaccess-Dateien durchsucht. Dies allein bringt Apache aus dem Weg.Um zu messen, wie schnell Ihr komplettes Skript auf dem Server ausgeführt wird, können Sie zahlreiche Tools verwenden. Stellen Sie zunächst sicher, dass Ihr Skript (z. B. preg_match vs strpos) dieselben Ergebnisse ausgeben muss, um Ihren Test zu qualifizieren.
Sie können verwenden:
quelle
Sie sollten sich Xdebug und insbesondere die Profilierungsfunktionen von Xdebug ansehen .
Grundsätzlich aktivieren Sie den Profiler und jedes Mal, wenn Sie eine Webseite laden, wird eine Cachegrind-Datei erstellt, die mit WinCacheGrind oder KCacheGrind gelesen werden kann .
Die Konfiguration von Xdebug kann etwas schwierig sein. Hier ist der relevante Abschnitt von my
php.ini
als Referenz:Und hier ist ein Screenshot einer
.out
Datei in WinCacheGrind :Das sollte reichlich Details darüber liefern, wie effizient Ihr PHP-Skript es ist. Sie möchten auf die Dinge abzielen, die die meiste Zeit in Anspruch nehmen. Sie könnten beispielsweise eine Funktion optimieren, um die Hälfte der Zeit in Anspruch zu nehmen, aber Ihre Bemühungen wären besser geeignet, um eine Funktion zu optimieren, die während eines Seitenladens Dutzende, wenn nicht Hunderte Male aufgerufen wird.
Wenn Sie neugierig sind, ist dies nur eine alte Version eines CMS, das ich für meinen eigenen Gebrauch geschrieben habe.
quelle
Versuchen Sie es mit https://github.com/fotuzlab/appgati
Es ermöglicht das Definieren von Schritten im Code und meldet Zeit, Speichernutzung, Serverlast usw. zwischen zwei Schritten.
Etwas wie:
Beispielausgabearray:
quelle
SetMemory()
) anstelle des hässlichen, aber immer noch allgegenwärtigenmixedCase()
Mistes, der in PHP sowieso praktisch sinnlos ist. Du bist wahrscheinlich zu alt. ;))Ich würde in xhprof schauen . Es spielt keine Rolle, ob es auf dem CLI oder über ein anderes Sapi (wie fpm oder fcgi oder sogar das Apache-Modul) ausgeführt wird.
Das Beste an xhprof ist, dass es sogar fit genug ist, um in der Produktion ausgeführt zu werden. Etwas, das mit xdebug nicht so gut funktioniert (das letzte Mal, als ich es überprüft habe). xdebug wirkt sich auf die Leistung aus und xhprof (ich würde nicht sagen, dass es keine gibt) schafft es viel besser.
Wir verwenden häufig xhprof, um Proben mit echtem Datenverkehr zu sammeln und dann den Code von dort zu analysieren.
Es ist nicht wirklich ein Maßstab in Bezug darauf, dass Sie eine Zeit bekommen und all das bekommen, obwohl es das auch tut. Es macht es einfach sehr einfach, den Produktionsverkehr zu analysieren und dann im gesammelten Callgraph einen Drilldown auf die PHP-Funktionsebene durchzuführen.
Sobald die Erweiterung kompiliert und geladen ist, beginnen Sie mit der Profilerstellung im Code mit:
Stoppen:
Speichern Sie dann die Daten in einer Datei oder Datenbank - was auch immer Ihr Boot schwebt und die übliche Laufzeit nicht unterbricht. Wir senden dies asynchron an S3, um die Daten zu zentralisieren (um alle Läufe von allen unseren Servern sehen zu können).
Der Code auf github enthält einen Ordner xhprof_html, den Sie auf dem Server sichern. Mit minimaler Konfiguration können Sie die gesammelten Daten visualisieren und mit dem Drilldown beginnen.
HTH!
quelle
Setzen Sie es in eine
for
Schleife, um jede Sache 1.000.000 Mal zu tun, um eine realistischere Zahl zu erhalten. Starten Sie den Timer erst kurz vor dem Code, den Sie tatsächlich messen möchten, und zeichnen Sie dann die Endzeit kurz danach auf (dh starten Sie den Timer nicht vor demsession_start()
.Stellen Sie außerdem sicher, dass der Code für jede Funktion, die Sie bewerten möchten, identisch ist, mit Ausnahme der Funktion, die Sie steuern.
Die Ausführung des Skripts (Cronjob, PHP über die Befehlszeile, Apache usw.) sollte keinen Unterschied machen, da Sie nur den relativen Unterschied zwischen der Geschwindigkeit der verschiedenen Funktionen zeitlich festlegen. Dieses Verhältnis sollte also gleich bleiben.
Wenn auf dem Computer, auf dem Sie den Benchmark ausführen, viele andere Dinge ausgeführt werden, kann dies die Benchmark-Ergebnisse beeinflussen, wenn die CPU- oder Speicherauslastung einer anderen Anwendung während der Ausführung Ihres Benchmarks ansteigt. Aber solange Sie eine Menge Ressourcen auf dem Computer haben, denke ich nicht, dass dies ein Problem sein wird.
quelle
Ein guter Anfang ist die Verwendung des xdebugs-Profilers http://xdebug.org/docs/profiler
Vielleicht nicht die einfachste Einrichtung und Verwendung, aber sobald Sie sie in Betrieb genommen haben, sind die Datenmengen und die einfache Anzeige unersetzlich.
quelle
Eric,
Sie stellen sich die falsche Frage. Wenn Ihr Skript in ~ 15 mSec ausgeführt wird, ist seine Zeit weitgehend irrelevant. Wenn Sie auf einem gemeinsam genutzten Dienst ausgeführt werden, dauert die Aktivierung des PHP-Images ~ 100 mSec, wobei die Skriptdateien ~ 30-50 mSec eingelesen werden, wenn sie vollständig auf dem Server zwischengespeichert sind, möglicherweise 1 oder mehr Sekunden, wenn sie von einer Backend-NAS-Farm geladen werden. Netzwerkverzögerungen beim Laden der Seitenmöbel können viele Sekunden hinzufügen.
Das Hauptproblem hierbei ist die Wahrnehmung der Ladezeit durch den Benutzer: Wie lange muss er zwischen dem Klicken auf den Link und dem Abrufen einer vollständig gerenderten Seite warten? Schauen Sie sich Google Page Speed an, das Sie als Ff- oder Chrome-Erweiterung verwenden können, und die Pagespeed-Dokumentation, in der ausführlich erläutert wird, wie Sie eine gute Seitenleistung erzielen. Befolgen Sie diese Richtlinien und versuchen Sie, Ihre Seitenwerte besser als 90/100 zu erzielen. (Die Google-Startseite erreicht 99/100 Punkte, ebenso wie mein Blog). Dies ist der beste Weg, um eine vom Benutzer wahrgenommene Leistung zu erzielen.
quelle
Es ist auch gut, den PHP-Code im Auge zu behalten und mit diesem Link zu überprüfen , um sicherzustellen, dass Ihre Codierung selbst die Leistung der App möglicherweise nicht beeinträchtigt.
quelle