Immer getrusage() für die Messung der system-Zeit im C
Ich würde gerne Messen, das system die Zeit, die zum ausführen von code. Um dies zu tun ich weiß, ich würde die sandwich-Sprach-code zwischen den beiden anrufen zu getrusage(), aber ich bekomme einige unerwartete Ergebnisse...
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
int main() {
struct rusage usage;
struct timeval start, end;
int i, j, k = 0;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_stime;
for (i = 0; i < 10000; i++) {
/* Double loop for more interesting results. */
for (j = 0; j < 10000; j++) {
k += 20;
}
}
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_stime;
printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);
return 0;
}
Ich hoffe, dass dieser produziert zwei verschiedene zahlen, aber ach! Nachdem ich meinen computer denken für eine Sekunde oder zwei, das ist das Ergebnis:
Started at: 0.1999s
Ended at: 0.1999s
Bin ich nicht mit getrusage() richtig? Warum sollte man nicht diese beiden zahlen unterschiedlich sein? Wenn ich grundlegend falsch, gibt es eine andere Möglichkeit mit getrusage() zur Messung der Systemzeit von einigen source-code? Danke für das Lesen.
- Bitte beachten Sie, dass
tv_usec
sind Mikrosekunden, so dass Ihr format sollte%lu.%06u
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist Missverständnis der Unterschied zwischen "Benutzer" und "system" - Zeit. Dein Beispiel-code ausgeführt wird, vor allem im user-mode (ie, läuft Ihre Anwendung code), während Sie Messen, aber die "system" - Zeit ist ein Maß an Zeit, die der Ausführung im kernel-Modus (dh, die Verarbeitung der system calls).
ru_stime
ist, das richtige Feld zu Messen, system Zeit. Ihre test-Anwendung gerade passiert, nicht zu erwachsen zu der Zeit zwischen den beiden Punkten, die Sie überprüfen.Sollten Sie verwenden
usage.ru_utime
, die Benutzer-CPU-Zeit, statt.ru_stime
. Andernfalls verwenden Sieru_utime
.clock_gettime
mit der cpu-Zeit-Uhr...Nutzung von gprof. Dies gibt Ihnen die Zeit, die für jede Funktion.
Installieren Sie gprof und verwenden Sie diese flags für die Zusammenstellung -pg -fprofile-arcs -ftest-coverage.