Hallo!
Ich verwende die Funktion clock() in ctime um damit die Geschwindigkeit der Animationen meiner Grafikapplikation zu steuern. Die Applikation soll unter Windows, Linux und MacOS X laufen. Unter Windows läuft sie problemlos. Unter Linux und MacOS X gibt es Probleme mit der Ablaufgeschwindigkeit, die ich in folgendem Beispielprogramm simuliert habe:
#include <iostream>
#include <ctime>
int main(){
clock_t t1, t2;
t1 = clock(); // Referenzwert zum Programmstart speichern
while (true){
t2 = clock(); // Aktuellen Clock abfragen ...
std::cout << double(t2 - t1) / CLOCKS_PER_SEC << std::endl; // ... und aus der Clock-Differenz auf die Laufzeit schließen
}
return 0;
}
Alles anzeigen
Es sollten nun ständig Zahlen ausgegeben werden, die im Sekundentakt um genau 1 hochzählen. Unter Windows ist das auch so, unter Linux und MacOS zählen sie aber deutlich langsamer hoch (etwa alle 3 Sekunden um 1).
Wenn ich das Programm so ändere dass die Ausgabe mit std::cout nur z.B. alle 100.000 Schleifeniterationen stattfindet, dann ist der Fehler deutlich geringer. Es sieht für mich jetzt so aus als ob clock() nur die Clocks im aktuellen Prozess misst und nicht systemweit (diese Vermutung habe ich nicht zuletzt deswegen, weil die Zeit, die während eines sleep()-Aurufs vergeht, offensichtlich nicht mitgezählt wird). Da std::cout sicher eine Kernelfunktion aufruft wird diese Zeit wohl auch nicht mitgezählt. Dabei sollte ja clock() soweit ich weiß pro Sekunde um genau CLOCKS_PER_SEC hochzählen, und zwar unabhängig von der Systemauslastung, dem aktuellen Prozess und sonstigen Gegebenheiten - zumindest gibt das ein Beispiel im Buch "Die C++-Programmiersprache" so zu verstehen. Dort wird angepriesen dass man mit dieser Funktion Zeitintervalle messen kann. Wenn aber Aufrufe von Kernelfunktionen nicht mitgezählt werden ist die Funktion ja für diesen Zweck nicht brauchbar.
Wie kann ich Zeitintervalle zuverlässig und plattformunabhängig messen? Und vor allem soll wirklich die Zeit gemessen werden, und nicht wie lange der Prozess bearbeitet wurde. Schön wäre es auch noch, wenn es ein wenig exakter ginge als mit clock(), denn selbst wenn ich oben genanntes Problem nicht hätte wäre mir die Genauigkeit von 1/100 Sekunde unter MacOS zu ungenau (CLOCKS_PER_SEC ist dort 100, unter Windows ist es 1000; unter Linux sogar 1.000.000 - funktioniert aber wie gesagt nicht).
mfg