Wie Messen die cpu-Zeit und die wall-clock-Zeit?
Sah ich viele Themen über diese, auch auf stackoverflow, zum Beispiel:
Wie kann ich Messen, CPU-Zeit und die wall-clock-Zeit auf Linux/Windows?
Will ich Messen die cpu-und Mauer-Zeit. Obwohl die person, die beantwortet eine Frage im Thema geschrieben ich empfehlen gettimeofday
zu Messen, eine Wand mal, ich habe gelesen, dass es besser verwenden, anstatt clock_gettime
. Also schrieb ich den folgenden code (ist es ok, ist es wirklich Messen in eine Wand ein Zeit, nicht die cpu-Zeit? Im Fragen, weil ich fand eine Webseite: http://nadeausoftware.com/articles/2012/03/c_c_tip_how_measure_cpu_time_benchmarking#clockgettme, wo es heißt, dass clock_gettime
misst eine cpu-Zeit...), Was die Wahrheit und was sollte ich verwenden, um zu Messen, in eine Wand ein Zeit?
Andere Frage ist, über die cpu-Zeit. Ich fand die Antwort, dass clock
ist groß über Sie, so schrieb ich ein Beispiel-code für Sie zu. Aber es ist nicht, was ich wirklich will, meinen code zeigt er mir eine 0 secods der cpu-Zeit. Ist es möglich zu Messen, cpu-Zeit mehr genau (in Sekunden)? Vielen Dank für jede Hilfe (für jetzt auf, Im interessiert nur in Linux-Lösungen).
Heres mein code:
#include <time.h>
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
#include <stdlib.h>
int main()
{
int i;
double sum;
//measure elapsed wall time
struct timespec now, tmstart;
clock_gettime(CLOCK_REALTIME, &tmstart);
for(i=0; i<1024; i++){
sum += log((double)i);
}
clock_gettime(CLOCK_REALTIME, &now);
double seconds = (double)((now.tv_sec+now.tv_nsec*1e-9) - (double)(tmstart.tv_sec+tmstart.tv_nsec*1e-9));
printf("wall time %fs\n", seconds);
//measure cpu time
double start = (double)clock() /(double) CLOCKS_PER_SEC;
for(i=0; i<1024; i++){
sum += log((double)i);
}
double end = (double)clock() / (double) CLOCKS_PER_SEC;
printf("cpu time %fs\n", end - start);
return 0;
}
Kompilieren Sie es wie folgt:
gcc test.c -o test -lrt -lm
und es zeigt mir:
wall time 0.000424s
cpu time 0.000000s
Ich weiß, ich kann mehr Wiederholungen, aber das ist nicht der Punkt hier 😉
WICHTIG:
printf("CLOCKS_PER_SEC is %ld\n", CLOCKS_PER_SEC);
zeigt
CLOCKS_PER_SEC is 1000000
Ich wünschte, ich könnte, aber ich brauche es selbst zu tun 🙂
Vielleicht, wenn man nicht dividieren des Ergebnisses der
clock()
Funktion von CLOCKS_PER_SEC
Ihre Auflösung wäre besser als eine zweite, hrm?was passiert, wenn man eine Zahl und dividieren Sie durch andere, wird es genauer oder weniger? Einfachere Frage: ist es größer oder kleiner? Ja, die website, die Sie Links ist die Aufteilung in Ihrem Beispiel, aber es fällt auf Sie zu verstehen, die Argumentation, und ohne Zweifel, warum auch immer hat es nicht für eine verbesserte Auflösung. Wie um die "richtige cpu-Zeit für wissen" - wenn clock() zurückgegeben richtigen cpu-Zeit, dann durch nicht ändern, natürlich. NIE geben Sie im code finden Sie in einem zufälligen Ort, ohne sich Gedanken darüber machen was es tatsächlich erste.
"Was ist die Wahrheit und was sollte ich verwenden, um zu Messen, in eine Wand ein Zeit?" - Tatsache ist, dass es viele verschiedene Methoden zum Messen der Wand die Zeit. Einige genauer sind als andere. Einige mehr tragbar als andere. Sie nehmen Sie nehmen und verwenden, was zu Ihrer Stimmung passt. Meine Antwort auf die Frage, die Sie im Zusammenhang verwendet
gettimeofday()
weil das das erste war, das funktionierte gut genug für mich.
InformationsquelleAutor Brian Brown | 2013-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut meinem Handbuch Seite auf
clock
es sagtWenn die Erhöhung der Anzahl der Iterationen auf meinem computer die gemessene cpu-Zeit beginnt, welche auf 100000 Iterationen. Aus den zurückgegebenen zahlen scheint es die Auflösung von 10 Millisekunden.
Vorsicht: wenn Sie optimieren Ihren code, die ganze Schleife kann verschwinden, weil
sum
ist ein Toter Wert. Es gibt auch nichts zu stoppen, wenn der compiler von bewegen derclock
Aussagen über die Schleife, da es keine realen Abhängigkeiten mit dem code dazwischen.Lassen Sie mich etwas näher auf die micro-Messungen der performance von code. Der naive und der verlockende Weg, um die Leistung zu Messen ist in der Tat durch das hinzufügen von
clock
Aussagen, wie Sie getan haben. Da jedoch die Zeit ist nicht ein Konzept oder eine Nebenwirkung in C, Compiler kann oft bewegen sich dieseclock
Anrufe. Um dies zu beheben, ist es verlockend zu machen, wieclock
Anrufe Nebenwirkungen haben, indem Sie z.B. mit ihm den Zugriffvolatile
Variablen. Allerdings ist diese immer noch nicht verbieten, den compiler von Umzug sehr nebenwirkungsfreie code über die Anrufe. Denken Sie zum Beispiel an regelmäßigen Zugriff auf lokale Variablen. Aber viel schlimmer ist, durch dieclock
Anrufe sehen sehr beängstigend für den compiler, werden Sie tatsächlich negative Auswirkungen auf alle Optimierungen. Als Ergebnis, die bloße Messung der Auswirkungen auf die Leistung, die Leistung in eine negative und unerwünschte Weise.Wenn Sie profiling wie bereits erwähnt von jemandem, können Sie eine ziemlich gute Einschätzung der Leistung auch optimierte code, obwohl die gesamte Zeit natürlich erhöht.
Ein weiterer guter Weg, um die Leistung zu Messen ist, nur fragt der compiler melden, die Anzahl der Zyklen einige code nehmen. Für eine Reihe von Architekturen der compiler hat eine sehr genaue Schätzung. Aber die meisten, insbesondere für Pentium-Architektur ist es nicht, da die hardware nicht viel planen, das ist schwer vorherzusagen.
Es ist zwar nicht Stand der Praxis ich denke, Compiler unterstützen sollte, eine
pragma
kennzeichnet eine Funktion, um gemessen zu werden. Der compiler dann gehören high precision non-intrusive Messung von Punkten im Prolog und Epilog einer Funktion und verbieten inlining der Funktion. Je nach Architektur können wählen, eine hochpräzise Uhr um die Zeit zu Messen, am besten mit Unterstützung vom OS nur die Zeit Messen des aktuellen Prozesses.clocks
Unterschied durch CLOCKS_PER_SEC, richtig? Aber Ihr Punkt ist, nur mit 100000 oder mehr Iterationen kann ich sehen, Ergebnisse in Sekunden?Mein Punkt ist, dass, obwohl
CLOCKS_PER_SEC
ist 1000000, derclock
Funktion zurückgegeben wird ein Vielfaches von 10000 auf meinem system und ich denke auf den meisten Linux-Systemen. So bekommen Sie eine angemessene Messung, die Sie benötigen, um die Anwendung auszuführen, die für mindestens einige Zehntel Sekunden. Aber wirklich mein Punkt ist, dass es sehr schwer zu tun, Mikro-Messungen code, da der compiler nichts von den Dingen, die Sie Messen wollen und können, planen Sie Ihre Messpunkte in unerwarteter Weise.Ich habe einige weitere Ausarbeitung auf Mikro-Messungen.
InformationsquelleAutor Bryan Olivier