Dies ist eigentlich gut, da es Ihnen eher CPU-Zeit als verstrichene Zeit gibt (verstrichene Zeit könnte von anderen Prozessen beeinflusst werden). Denken Sie nur daran, dass eine Zahl von 10 Sekunden nicht unbedingt bedeutet, dass es in einer verstrichenen Zeit von 10 Sekunden ausgeführt wird, da es möglicherweise E / A-Überlegungen gibt. Dies misst die CPU NUR.
– paxdiablo
20. Januar 2009 um 1:22 Uhr
Ich habe dies hunderte Male verwendet und ist die beste/einfachste Lösung für diese Frage
– Gerhard
21. Januar 2009 um 6:18 Uhr
Sie können das alles sogar in ein Makro packen, wenn Sie häufig mehrere Dinge zeitlich messen: #define timing(a) start=clock(); a; diff = Uhr () – Start; msec = diff * 1000 / CLOCKS_PER_SEC; printf(“msec: %d\n”,msec); und dann aufrufen: timing(IntenseFunc1())
– eqzx
26. Februar 2012 um 19:03 Uhr
clock_t ist normalerweise lang und CLOCKS_PER_SEC ist 1000000. In diesem Fall führt eine Differenz von mehr als 4 Sekunden zu einem Überlauf und seltsamen Ergebnissen
– Begelfor
5. März 2014 um 13:22 Uhr
@paxdiablo Ich bekomme damit völlig gleichwertige Ergebnisse wie mit gettimeofday(), bin mir nicht sicher, was du hier sagst.
– Benutzer3467349
21. Oktober 2014 um 21:47 Uhr
gettimeofday() wird wahrscheinlich das tun, was Sie wollen.
Wenn Sie Intel-Hardware verwenden, erfahren Sie hier, wie Sie den CPU-Echtzeit-Befehlszähler lesen. Es zeigt Ihnen die Anzahl der seit dem Start des Prozessors ausgeführten CPU-Zyklen an. Dies ist wahrscheinlich der feinste, niedrigste Overhead-Zähler, den Sie für die Leistungsmessung erhalten können.
Beachten Sie, dass dies die Anzahl der CPU-Zyklen ist. Unter Linux können Sie die CPU-Geschwindigkeit aus /proc/cpuinfo abrufen und dividieren, um die Anzahl der Sekunden zu erhalten. Es ist ziemlich praktisch, dies in ein Doppel umzuwandeln.
Wenn ich das auf meiner Box starte, bekomme ich
11867927879484732
11867927879692217
it took this long to call printf: 207485
#include <stdio.h>
#include <stdint.h>
inline uint64_t rdtsc() {
uint32_t lo, hi;
__asm__ __volatile__ (
"xorl %%eax, %%eax\n"
"cpuid\n"
"rdtsc\n"
: "=a" (lo), "=d" (hi)
:
: "%ebx", "%ecx");
return (uint64_t)hi << 32 | lo;
}
main()
{
unsigned long long x;
unsigned long long y;
x = rdtsc();
printf("%lld\n",x);
y = rdtsc();
printf("%lld\n",y);
printf("it took this long to call printf: %lld\n",y-x);
}
gettimeofday gibt die Zeit innerhalb der Auflösung der Systemuhr auf Mikrosekunden genau zurück. Vielleicht möchten Sie sich auch die ansehen Hochauflösende Timer Projekt auf SourceForge.
Hohe Auflösung ist relativ … Ich habe mir die Beispiele angesehen und sie berücksichtigen meistens Millisekunden. Für mich ist es jedoch wichtig, Mikrosekunden zu messen. Ich habe keine plattformunabhängige Lösung für Mikrosekunden gesehen und dachte, dass so etwas wie der folgende Code nützlich sein wird. Ich habe vorerst nur auf Windows getimt und werde höchstwahrscheinlich eine gettimeofday() -Implementierung hinzufügen, wenn ich dasselbe auf AIX/Linux mache.