Zeitmessungen auf Multicoresystemen
-
Ich möchte Performancemessungen machen.
Die Zeitstempel werden innerhalb verschiedener Threads aufgezeichnet und am Ende des Programms ausgewertet. Dabei möchte ich vermeiden, dass gewisse Zeitstempelfunktionen Probleme mit Multithreading und Multiprozessorsystemen haben.
clock_gettime mit dem Parameter CLOCK_THREAD_COMPUTE_ID ist z. B. nicht geeignet, was ich auch schon praktisch feststellen musste, da die Schwankungen einfach zu groß sind.L. G.
Steffo
-
Hochauflösende Performancemessungen, dazu ist clock_gettime gemacht und gettimeofday absolut nicht gemacht.
-
Welchen Parameter sollte ich da nehmen? CLOCK_MONOTONIC?
gettimeofday() bietet ja eine Auflösung im Mikrosekundenbereich. Ist das nicht ausreichend?
-
Wenn C++11 zur Verfuegung steht: http://en.cppreference.com/w/cpp/chrono/high_resolution_clock
-
Warum gettimeofday schon mal keine gute Idee ist: Mach ein Programm, dass die Startzeit misst, dann lange wartet und nochmal die Zeit misst und dir die Differenz ausgibt. Während das Programm wartet, stellst du einfach mal die Systemzeit auf deinem System um. zB 3 Stunden zurück oder wechsle von Sommer- zu Winterzeit...
Also nimm das Tool was speziell für deinen Zweck gemacht wurde (clock_gettime) und missbrauche nicht gettimeofday.
-
rüdiger schrieb:
Also nimm das Tool was speziell für deinen Zweck gemacht wurde (clock_gettime) und missbrauche nicht gettimeofday.
OK, aber mit welchen Parametern? CLOCK_MONOTONIC?
@knivil: Absolutes NoGo. Hab meine Vorgaben.
-
Steffo schrieb:
gettimeofday() bietet ja eine Auflösung im Mikrosekundenbereich. Ist das nicht ausreichend?
Die Auflösung mag zwar Mikrosekunden sein, aber probier mal aus, was der Tick ist. Und natürlich das, was knivil gesagt hat. Für Performancemessungen möchtest du schließlich auch nicht die Wall-Clock-Time, sondern in der Regel die CPU-Zeit. Und noch viel mehr bietet es sich an, einen fertigen Profiler zu benutzen. Warum machst du das nicht?
-
SeppJ schrieb:
Die Auflösung mag zwar Mikrosekunden sein, aber probier mal aus, was der Tick ist. Und natürlich das, was knivil gesagt hat. Für Performancemessungen möchtest du schließlich auch nicht die Wall-Clock-Time, sondern in der Regel die CPU-Zeit.
Hmm, ok, aber wie gesagt: Welcher Parameter ist hier geeignet? CLOCK_MONOTONIC?
Und noch viel mehr bietet es sich an, einen fertigen Profiler zu benutzen. Warum machst du das nicht?
gprofiler misst die sleeps nicht mit - generell nur user space zeugs -, außerdem muss ich auch Zeiten von Teilanweisungen innerhalb einer Funktion messen.
-
Kurz ja.
Desweiteren gibt es unter Linux auch noch /bin/time (nein, nicht das shell buil-in). Das sagt dir, wieviel Zeit im userspace gebraucht wurde, wieviel fuer I/O draufgegangen ist, Speicherallokationen, ....
-
OK, dann nehm ich CLOCK_MONOTONIC, thx!