High Resolution, Overhead Niska Timing dla procesorów Intel
Jeśli jesteś na sprzęcie Intel, oto jak do zapoznania się z procesora w czasie rzeczywistym licznik instrukcji. Pokaże liczbę cykli procesora wykonanych od momentu uruchomienia procesora. Jest to prawdopodobnie najdoskonalszy licznik, jaki można uzyskać w celu pomiaru wydajności.
Należy zauważyć, że jest to liczba cykli procesora. Na Linuksie możesz uzyskać prędkość procesora z/proc/cpuinfo i podzielić, aby uzyskać liczbę sekund. Przekształcenie tego w podwójne jest bardzo przydatne.
Gdy uruchomię to na moim polu, mam
11867927879484732
11867927879692217
it took this long to call printf: 207485
Oto Intel developer's guide, który daje mnóstwo szczegółów.
#include <stdio.h> // stackoverflow bug: pre tag eats the filenames,
#include <stdint.h> // so i had to put spaces in the angle brackets
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);
}
Dyspozycja RDTSC jest zalecane, ponieważ może dać błędne wyniki, jeśli CPU przechodzi w stan uśpienia, a także nie wytwarza spójnych wyników między rdzeniami systemu wielordzeniowych. –
Te problemy dotyczą również QueryPerformanceTimer - http://www.virtualdub.org/blog/pivot/entry.php?id=106 – yrp
QueryPerformanceCounter() w systemie Vista z HPET nie ma tych problemów, ani nie jest włączony XP z/USEPMTIMER. AMD oferuje sterownik procesora, który poprawia synchronizację QPC() w XP. Korzystanie z RDTSC bezpośrednio uniemożliwia korzystanie z tych ulepszeń. – bk1e