Erhalten einzelner Werte des BenchmarkTimers

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Erhalten einzelner Werte des BenchmarkTimers

Beitrag von Screeze » 10.05.2010, 19:17:40

Hi,
ist es möglich anstatt eines ganzen Reports nur einzelne Werte auszulesen, z.b. die Gesamtzeit die die Ausführung benötigt hat ? (evtl. mit der Option doch noch den ganzen report zu bekommen, falls man beim debugging nur den report irgendwie verarbeiten/speichern will, wenn die ausührungszeit einen Wert x übersteigt)

Vielen Dank ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4525
Registriert: 04.11.2007, 16:13:53

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von dr.e. » 11.05.2010, 00:04:00

Hallo Ralf,

bisher ist das im BenchmarkTimer selbst nicht implementiert. Technisch möglich ist es jedoch auf jeden Fall. Hierzu musst du den Baum des Benchmarkers traversieren und die gewünschten Werte (z.B. den Root-Knoten) auslesen. Sofern du beispielsweise gleichartige Aufrufe (z.B. *onParseTime()*) gruppiert darstellen möchtest, muss das ebenso in einer entsprechenden Logik abgebildet werden.

Wenn du eine eigene Ausgabe implementieren möchtest, schau dir mal die Klasse BenchmarkTimer an, dort findest du in der Methode createReport() ein Beispiel, wie so ein Report erstellt werden kann und wie der Baum der Benchmark-Messpunkte gehandhabt werden muss. Das Auslesen der kompletten Zeit ist dabei recht einfach, eine Gruppierung dagegen etwas aufwendiger.

Reicht dir das oder brauchst du noch mehr Informationen?
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von Screeze » 11.05.2010, 14:45:08

Hmm so wichtig ists dann (derzeit) doch nicht - wäre nur ein nice2have gewesen, aber den aufwand den zu zerpflücken rechnet das nicht ;)

Trotzdem danke, villeicht kann ichs später mal brauchen.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von Megger » 12.05.2010, 16:29:39

Ich stimme zu, es ist wirklich ein nice2have. Vielleicht setze ich mich irgendwann mal daran :D
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4525
Registriert: 04.11.2007, 16:13:53

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von dr.e. » 12.05.2010, 23:25:47

Hallo Megger,

das klingt wie ein Angebot für die Weiterentwicklung des Benchmark-Reports! ;)

@Ralf: ok, wenn du Fragen oder Feature-Anträge zu diesem Thema hast, dann immer her damit, wir können das für 1.13 bzw. 1.14 einplanen.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von Megger » 13.05.2010, 00:57:27

Habe es mir mal ein bisschen angeschaut :D
Man kann ja einfach den kompletten Baum durchlaufen und dann die entsprechende Ausführungszeit auslesen. Allerdings gibt es ja Prozesse mit den gleichen Namen? Entweder nimmt man dort dann den ersten gefundenen Prozess oder man rechnet alles zusammen, aber das meintest du sicher mit gruppieren?

evtl. mit der Option doch noch den ganzen report zu bekommen

Da würde ich dann eher soetwas machen

Code: Alles auswählen

if($BenchmarkTimer->getExecutionTime('ProcessName')>10) {
    $BenchmarkTimer->createReport();
}
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von Screeze » 13.05.2010, 12:00:34

Jep so in der Art hatte ich das gedacht.

Anträge...

Villeicht noch einen:
Du schreibst dass es extreme performance vorteile hat, den benchmarkreport zu deaktivieren.
Wenn man diesen Vorteil nutzen will, aber trotzdem eine benachrichtigung, sobald ein request zu lange dauert, wäre da folgendes möglich?:
Statt den Report abzuschalten, könnte man auf einen modus umschalten, der nur die gesamtzeit berechnet und zur verfügung stellt.

Ansonsten hat Megger das wichtigste schon genannt.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4525
Registriert: 04.11.2007, 16:13:53

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von dr.e. » 14.05.2010, 10:02:23

Hallo ihr beiden,

mit gruppierten meinte ich etwa die Zeiten mit einem bestimmten Keyword (z.B. transform) zusammen zu rechnen. Dann hätte man beispielsweise die gesamte Zeit, die für die Transformation benötigt wurde. Selbiges ist auch für die Analyse-Phase möglich. Hier sind dann die Aufrufe mit den Keywords onParseTime und onAfterAppend relevant.

Sofern man nur die komplette Zeit benötigt, gibt es deutlich perfromantere Mess-Methoden als den BenchmarkTimer:

Code: Alles auswählen

$start = microtime(true);

$page = new Page();
$page->loadDesign(...,...);
echo $page->transfrom();

$end = microtime(true);
$duration = $end - $start;

Das kannst du dir dann per E-Mail zuschicken lassen oder in eine Datei schreiben.

Statt den Report abzuschalten, könnte man auf einen modus umschalten, der nur die gesamtzeit berechnet und zur verfügung stellt.

Den kompletten Benchmarker laufen zu lassen braucht einfach viel zu viel Speicher (im Vergleich zur oben beschriebenen Methode!).

Wenn du dann Details brauchst, kannst du den BenchmarkTimer ja per URL-Parameter aktivieren.
Viele Grüße,
Christian


Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von Megger » 14.05.2010, 15:28:01

Aber bei einzelnen Bereichen sollte man dann auf den Benchmark Timer zurückgreifen?

Weil wenn ich alle Methoden usw. mit microtime abdecke, dann kann ich wahrscheinlich auch gleich den BenchmarkTimer benutzen
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4525
Registriert: 04.11.2007, 16:13:53

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von dr.e. » 14.05.2010, 23:29:23

Hallo Megger,

das ist eben die Gradwanderung. Wenn du mehrere Messpunkte (>3) benötigst, würde ich den BenchmarkTimer nutzen. Wenn es nur um eine Gesamt-Zeit geht, jedoch der Applikation sehr hohe Performance abverlangt wird, eher die oben aufgezeigte Variante. Grundsätzlich einfacher zu handhaben ist natürlich der BenchmarkTimer, da er für dich bereits alles erledigt.

Insofern scheint mir eine Kombination aus beiden Möglichkeiten durchaus sinnvoll. Man kann das ja z.B. per URL-Parameter steuerbar machen. Gibt es eine Problem-Situation, dann schaut man mit dem aktivierten BenchmarkTimer drauf. Klarer Nachtail ist natürlich, dass du zunächst keinen ausführlichen Bericht hast und eine Problem-Situation vorhanden sein muss um eine Analyse fahren zu können. Um das zu umgehen, könnte man natürlich auch in der index.php einen zusätzlichen Schalter einbauen, der den BenchmarkTimer bei Bedarf aktiviert.
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von MrNiceGuy » 24.05.2010, 09:42:43

Hilfreich für Erweiterungen jeglicher Art wäre ja, wenn die Klasse von Haus aus keine final wäre...
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4525
Registriert: 04.11.2007, 16:13:53

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von dr.e. » 24.05.2010, 12:22:11

Hallo Lutz,

das lässt sich leicht ändern. Die Frage ist dann nur, ob es nicht besser wäre, keine Vererbung, sondern Dekoration zu nutzen, sprich einfach den BenchmarkTimer zu nutzen, wie er ist und die Werte abzufragen, die er aufgenommen hat. Das sollte mit der API eigentlich möglich sein...
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von MrNiceGuy » 25.05.2010, 08:13:49

Natürlich. Die Änderung von final in nicht-final ist ja auch kein großer Akt, nur ist es beim nächsten Update dann wieder eine Fehlerquelle. Für den hier angestrebten Teil wäre es sicher auch über die API möglich, allerdings fände ich es dennoch klasse, wenn von Haus aus die Anpassung des BenchmarkTimers nicht "gesperrt" wäre!? Vielleicht muss ich mich aber auch einfach nur mehr mit der API davon auseinandersetzen...
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4525
Registriert: 04.11.2007, 16:13:53

Re: Erhalten einzelner Werte des BenchmarkTimers

Beitrag von dr.e. » 25.05.2010, 09:45:48

Hallo Lutz,

ich denke beides ist sinnvoll und notwendig. Ich werde das "final" aber bei Gelegenheit mal rausnehmen. Auf den ersten Blick scheint Vererbung immer das geeignete Mittel für eine Erweiterung zu sein, an vielen Stellen ist das aber nicht unbedingt gut, denn wenn sich die API der erweiterten komponente ändert, ändert sich auch deine Applikation an zig Stellen. Hier ist es sicher besser, die API nochmals gegen deine Applikation zu kapseln. Stellt vielleicht im ersten Schritt einen Mehraufwand dar, ist aber hinterher besser. Aus genau diesem Grund gab/gibt es das "final".
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast