Die C `Uhr ()` Funktion gibt nur eine Null
Frage
Die C clock()
Funktion gibt mir nur eine Null. Ich habe versucht, verschiedene Arten verwenden, ohne Verbesserung ... Ist das ein guter Weg, um Zeit mit guter Präzision zu messen?
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start, end;
double cpu_time_used;
char s[32];
start = clock();
printf("\nSleeping 3 seconds...\n\n");
sleep(3);
end = clock();
cpu_time_used = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
printf("start = %.20f\nend = %.20f\n", start, end);
printf("delta = %.20f\n", ((double) (end - start)));
printf("cpu_time_used = %.15f\n", cpu_time_used);
printf("CLOCKS_PER_SEC = %i\n\n", CLOCKS_PER_SEC);
return 0;
}
Sleeping 3 seconds... start = 0.00000000000000000000 end = 0.00000000000000000000 delta = 0.00000000000000000000 cpu_time_used = 0.000000000000000 CLOCKS_PER_SEC = 1000000
Plattform: Intel 32-Bit, RedHat Linux, gcc 3.4.6
Lösung
clock()
meldet CPU-Zeit verwendet. sleep()
keine CPU-Zeit verwenden. So Ihr Ergebnis ist wahrscheinlich genau richtig, nur nicht das, was Sie wollen.
Andere Tipps
man clock
. Es ist nicht zurückkehren, was Sie denken, es ist. Auch man gettimeofday
-. Es ist wahrscheinlicher, was Sie wollen
clock_t ist ein Integer-Typ. Sie können es nicht mit% f ausdrucken. Siehe Freds Antwort warum der Unterschied ist, 0.
printf("start = %.20f\nend = %.20f\n", start, end);
sollte:
printf("start = %d\nend = %d\n", start, end);
Beim sleep()
wird keine CPU-Zeit aufbrauchen. Sie sollten einen kleinen Unterschied, obwohl sehen. Ich korrigierte Ihre printf Typenkonflikt Fehler in dieser Zeile:
printf("start = %.20f\nend = %.20f\n", start, end);
Und es gab vernünftige Ergebnisse auf meiner Maschine:
start = 1419
end = 1485
delta = 66
cpu_time_used = 0.000066000000000
CLOCKS_PER_SEC = 1000000
Sie könnten gettimeofday()
versuchen die Echtzeit-Programms ausgegeben zu bekommen ausgeführt wird.
Sie müssen wahrscheinlich
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
und die Verwendung so etwas wie
double wall0 = get_wall_time();
double cpu0 = get_cpu_time();
for(long int i = 0; i<=10000000;i++){
func1();
}
double wall1 = get_wall_time();
double cpu1 = get_cpu_time();
cout << "Wall Time = " << wall1 - wall0 << endl;
cout << "CPU Time = " << cpu1 - cpu0 << endl;
statt
clock()
als Uhr nur und nur nur in CPU ausgegeben zählt die Zeit auf Leistungsindikatoren basieren. Sie können jedoch Ergebnis durch die Verwendung obiger Funktion erhalten. nur um zu überprüfen, Ihre Anwendung es mit der Zeit Befehl ausführen
wie time ./a.out
Ausgabe von Zeitbefehl:
real 0m5.987s
user 0m0.674s
sys 0m0.134s
und Ausgabe von benutzerdefinierter Funktion
Wall Time = 5.98505
CPU Time = 0.8