Profiling / Benchmarking
Ein allgemeines Beispiel zur Verwendung der Klasse timer finden sie hier.
Profiling / Benchmarking
static int timer::start(char* label)
Beginnt die Zeitmessung eines cscript-Programmabschnittes.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
label | String oder char* | - | frei wählbarer Name des Timers |
Einfacher Timer zum Messen der Ausführzeit von Skriptanweisungen.
int main () { // ... timer::reset (); for (i = 0; i < 10; ++i) { timer::start ("create and save snapshot");
// einige Anweisungen ...
timer::stop ("create and save snapshot"); } timer::dump (); return 0; }
static int timer::frame_start(
ItemRef frameRef,
char* key,
float intervall,
int flags = 0)
Starte einen Timer, der zur nächsten Ruhezeit des Programmes bestimmte Gestaltungsregeln des Rahmens ausführt. Ein Rahmen darf beliebig viele solcher Timer haben. Sie sollten aber darauf achten, dass die Timer möglichst kurze Ausführzeiten haben! Wird der Rahmen gelöscht, werden aktive Timer automatisch entfernt.
Im Parameter key der Funktion legen Sie fest, welche Gestaltungsregel(n) der Timer ausführen soll.
Dazu legen Sie innerhalb der Gestaltungsregeln einen Wenn Ereignis ausführen-Block
für das Ereignis key an. Alle Regeln innerhalb dieses Blockes werden dann
ausschließlich von diesem Timer ausgeführt. Hier ein Screenshot für einen Timer namens TIMER:Mein Timer:
Bitte beachten Sie : Damit die Timer-Bedingung aktiviert ist, muss mindestens eine Regel der Bedingung einen Ausführzeitpunkt gesetzt haben. Es ist egal, welchen Ausführzeitpunkt Sie wählen, es ist nur wichtig, dass mindestens eine Bedingung aktiviert ist.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode -1199 : Aufruf von comet_pdf |
|
frameRef | ItemRef | - | Für diesen Rahmen soll der Timer definiert werden. Wird der Rahmen gelöscht oder das Dokument geschlossen, wird der Timer automatisch gestoppt. |
key | String oder char* | - | Name des Ereignisses, dessen Gestaltungsgegeln ausgeführt werden sollen. |
intervall | float | - | Start/Intervall des Timers in Sekunden <= 1.0 : Einmaliges Ausführen des Timers >= 1.0 : Wiederholtes Ausführen des Timers im angegebenen Intervall Die minmale absolute Länge des Intervalls beträgt 1 Sekunde! |
flags | int | 0 | Zusatzangaben zum Timer 0 : keine weiteren Angaben 1 : Timer nur ausführen, wenn das Dokument das aktuelle Front-Dokument ist |
In einem Textrahmen soll die verbleibende Zeit einer festgelegten Zeitspanne (z.B. die Länge eines Vortrages) gezeigt werden. Ist die Zeit abgelaufen, wird der Text "Ende!" angezeigt. Nachdem der Timer mit timer::frame_start (gFrame, "Mein Timer", 5.0); gestartet wurde, kann das folgende Skript für die entsprechende Gestaltungsregel (Aktion mit der ClassID 36) verwendet werden.
#include "internal/types.h"
int kTimeSpan = 1200; char kKey[] = "Mein Timer";
int main () { char dt [512]; char now [512]; char str [512]; int sec = 0;
system::now (now, ddmmyyyy_hhmmss); timer::frame_get_start (gFrame, kKey, dt);
sec = kTimeSpan - system::time_diff (now, dt, ddmmyyyy_hhmmss);
sprintf (str, "%02d:%02d", sec/60, sec-((sec/60)*60)); if (sec < 0) { strcpy (str, "Ende!"); timer::frame_stop (gFrame, kKey); }
frame::replace (gFrame, str); return 0; }
static int timer::document_start(
ItemRef ref,
int actionID,
float intervall,
int flags = 0)
Installiere einen Idle-Time-Handler zur Ausführung eines Skriptes an einem Dokument. Es sind beliebig viele Timer erlaubt. Sie sollten aber darauf achten, dass die Timer möglichst kurze Ausführzeiten haben! Wird das Dokument geschlossen, werden aktive Timer dieses Dokumentes automatisch entfernt.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode -1199 : Aufruf von comet_pdf |
|
ref | ItemRef | - | Referenz auf das Dokument. Sie können ein beliebiges Objekt (z.B. gFrame) des
gewünschten Dokumentes verwenden. 0 : keine Bindung an ein Dokument (ab v4.3 R34900) Beachten Sie bitte, dass im 0-Fall auch die Funktionen timer::document_get_start und timer::document_stop mit der Dokument-Referenz 0 gerufen werden müssen. |
actionID | int | - | ID der Aktion der Timerfunktion. Die Aktion muss die ClassID 62 haben.
In dem Skript sind neben gFrame und gDocument folgende zusätzliche globale Variablen definiert:
|
intervall | float | - | Start/Intervall des Timers in Sekunden <= 0.0 : Einmaliges Ausführen des Timers > 0.0 : Wiederholtes Ausführen des Timers im angegebenen Intervall Die minmale absolute Länge des Intervalls beträgt 1 Sekunde! |
flags | int | 0 | Zusatzangaben zum Timer 0 : keine weiteren Angaben 1 : Timer nur ausführen, wenn das Dokument das aktuelle Front-Dokument ist |
Das folgende Skript (als Aktion der ID 123456 und mit der ClassID 62 gesichert) schreibt nach dem Timterstart timer::start (gFrame, 123456, 10.0); alle 10 Sekunden eine Meldung ins Logfile:
#include "internal/types.h"
int main () { String nm = string::alloc (); String dt = string::alloc ();
document::name (nm, gDocument); system::now (dt, hhmmss); wlog ("", "#### Doc timer called for '%s' : %s\n", nm, dt);
return 0; }
static int timer::stop(char* label)
Beendet die Zeitmessung eines cScript Programmabschnitts. Zu jedem timer::start Aufruf sollte ein korrespondierender timer::stop Aufruf mit demselben Label vorhanden sein.
In einer zweiten Version mit zwei Parametern stoppt die Funktion einen laufenden Timer eines definierten Schlüssels für diesen Rahmen.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder fehlercode -1199 : Aufruf von comet_pdf |
|
label | String oder char* | - | Name des Timers |
static int timer::frame_stop(ItemRef frameRef, char* key)
Beende einen Timer eines Rahmens.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder fehlercode -1199 : Aufruf von comet_pdf |
|
frameRef | ItemRef | - | gültige Rahmenreferenz |
label | String oder char* | - | Name des Timers |
static int timer::document_stop(ItemRef ref, int actionID)
Beende einen Timer eines Dokumentes.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder fehlercode -1199 : Aufruf von comet_pdf |
|
ref | ItemRef | - | Referenz für das Dokument. Sie können ein beliebiges Objekt (z.B. gFrame) des gewünschten Dokumentes verwenden. |
actionID | int | - | ID der Aktion, die der Timer ausführt |
static int timer::frame_get_start(
ItemRef frameRef,
char* key,
char* out_startDateTime)
Wann wurde ein Timer eines Rahmens gestartet?
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode 502 : Kein Timer gestartet für diesen Rahmen und diesen Schlüssel -1199 : Aufruf von comet_pdf |
|
frameRef | ItemRef | - | gültige Rahmenreferenz |
key | String oder char* | - | Schlüssel des Timers |
out_startDateTime | String oder char* | 0 | Startzeit des Timers im Format YYYYMMDDHHMMSS. Der Parameter darf 0 sein. In diesem Fall testet die Funktion lediglich, ob ein Timer gestartet wurde. Sonst muss die Variable einen allokierten String mind. der Länge 15 haben. |
static int timer::document_get_start(
ItemRef ref,
char* key,
char* out_startDateTime)
Wann wurde ein Timer eines Dokumentes gestartet?
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode 502 : Kein Timer gestartet für diesen Rahmen und diesen Schlüssel -1199 : Aufruf von comet_pdf |
|
ref | ItemRef | - | Referenz für das Dokument. Sie können ein beliebiges Objekt (z.B. gFrame) des gewünschten Dokumentes verwenden. |
actionID | int | - | ID der Aktion, die der Timer ausführen soll |
out_startDateTime | String oder char* | 0 | Startzeit des Timers im Format YYYYMMDDHHMMSS. Der Parameter darf 0 sein. In diesem Fall testet die Funktion lediglich, ob ein Timer gestartet wurde. Sonst muss die Variable einen allokierten String mind. der Länge 15 haben. |
static int timer::reset(char* label = 0)
Setzt alle Werte zurück
Name | Typ | Default | Beschreibung |
Return | int | 0 | |
label | String oder char* | 0 | frei wählbare Bezeichnung. Hier muss die selbe Bezeichnung wie bei start verwendet werden. |
static int timer::dump(char* label)
Gib die gemessenen Zeiten in die Log-Datei aus.
Name | Typ | Default | Beschreibung |
Return | int | 0 | |
label | String oder char* | - | frei wählbare Bezeichnung. Hier muss die selbe Bezeichnung wie bei start verwendet werden. |
static float timer::get_seconds(char* label, int what)
Hole eine gemessene Zeit.
Name | Typ | Default | Beschreibung |
Return | float | Gemessene Zeit in Sekunden oder -1.0 im Fehlerfall | |
label | String oder char* | - | Name des Timers aus start |
what | int | - | Welche Zeit wollen Sie wissen? 0 : ΔTs Durchschnittszeit, die für eine Zeitmessung selbst benötigt wurde. 1 : schnellste 2 : schnellste - ΔTs 3 : langsamste 4 : langsamste - ΔTs 5 : Durchschnitt 6 : Durchschnitt - ΔTs 7 : erste 8 : erste - ΔTs 9 : letzte 10 : letzte - ΔTs 11 : Summe 12 : Summe - ΔTs |
static int timer::get_counter(char* label, int what)
Hole einen gemessenen Wert.
Name | Typ | Default | Beschreibung |
Return | int | Gemessener Wert oder -1 im Fehlerfall | |
label | String oder char* | - | frei wählbare Bezeichnung. Hier muss die selbe Bezeichnung wie bei start verwendet werden. |
what | int | - | Welchen Wert wollen Sie wissen? 1 : Anzahl der Aufrufe 2 : max. Rekurssionstiefe 3 : Stack |
Messen der Zeitaufwände einzelner Skriptteile : "Klammern" Sie Teile Ihres Skriptes in start/stop_timer Aufrufe. Jeder Timer bekommt einen neuen Namen. Im Logfile können Sie die Ergebnisse durch eine Suche nach dem verwendeten Timer-Präfix leicht finden.
char stTimerPrefix[] = "XXXX";
int stTimerID = 0; char stTimerLabel [256];
char * timer_label () { sprintf (stTimerLabel, "%s %d", stTimerPrefix, stTimerID); return stTimerLabel; }
int start_timer () { ++stTimerID; timer::start (timer_label ()); return 0; }
int stop_timer () { float duration = 0.0; int hh = 0, mm = 0, ss = 0, milli = 0; timer::stop (timer_label ());
duration = timer::get_seconds (timer_label (),11); hh = toint (duration / 3600.0); mm = (toint (duration) % 3600) / 60; ss = toint (duration) % 60; milli = toint (duration * 1000.0 + 0.5) % 1000;
wlog("","%s stopped : %02d:%02d:%02d+%03d (%f)\n", timer_label (), hh, mm, ss, milli, duration);
timer::reset (timer_label ()); return 0; }
int main () { start_timer (); // // script statements // stop_timer ();
start_timer (); // // script statements // stop_timer ();
return 0; }
Alphabetic index HTML hierarchy of classes or Java