Jaki jest najlepszy sposób na synchronizację sekcji kodu z wysoką rozdzielczością i przenośnością?
/* Time from here */
ProcessIntenseFunction();
/* to here. */
printf("Time taken %d seconds %d milliseconds", sec, msec);
Czy istnieje standardowa biblioteka, która miałaby rozwiązanie wieloplatformowe?
c
performance
timer
timing
lillq
źródło
źródło
gettimeofday () prawdopodobnie zrobi to, co chcesz.
Jeśli korzystasz ze sprzętu firmy Intel, oto jak odczytać licznik instrukcji procesora w czasie rzeczywistym. Podaje liczbę cykli procesora wykonanych od momentu uruchomienia procesora. Jest to prawdopodobnie najdrobniejszy, najniższy licznik, jaki można uzyskać do pomiaru wydajności.
Zauważ, że jest to liczba cykli procesora. W Linuksie możesz pobrać prędkość procesora z / proc / cpuinfo i podzielić, aby uzyskać liczbę sekund. Konwersja tego na podwójną jest całkiem przydatna.
Kiedy uruchomię to na moim pudełku, dostaję
Oto przewodnik dla programistów firmy Intel, który zawiera mnóstwo szczegółów.
#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); }
źródło
Funkcja gettimeofday zwróci czas z dokładnością do mikrosekund w ramach rozdzielczości zegara systemowego. Możesz także sprawdzić projekt High Res Timers na SourceForge.
źródło
Używam SDL_GetTicks z biblioteki SDL .
źródło
Jeśli nie chcesz czasu procesora, myślę, że to, czego szukasz, to struktura timeval.
Do obliczenia czasu realizacji używam poniższego:
int timeval_subtract(struct timeval *result, struct timeval end, struct timeval start) { if (start.tv_usec < end.tv_usec) { int nsec = (end.tv_usec - start.tv_usec) / 1000000 + 1; end.tv_usec -= 1000000 * nsec; end.tv_sec += nsec; } if (start.tv_usec - end.tv_usec > 1000000) { int nsec = (end.tv_usec - start.tv_usec) / 1000000; end.tv_usec += 1000000 * nsec; end.tv_sec -= nsec; } result->tv_sec = end.tv_sec - start.tv_sec; result->tv_usec = end.tv_usec - start.tv_usec; return end.tv_sec < start.tv_sec; } void set_exec_time(int end) { static struct timeval time_start; struct timeval time_end; struct timeval time_diff; if (end) { gettimeofday(&time_end, NULL); if (timeval_subtract(&time_diff, time_end, time_start) == 0) { if (end == 1) printf("\nexec time: %1.2fs\n", time_diff.tv_sec + (time_diff.tv_usec / 1000000.0f)); else if (end == 2) printf("%1.2fs", time_diff.tv_sec + (time_diff.tv_usec / 1000000.0f)); } return; } gettimeofday(&time_start, NULL); } void start_exec_timer() { set_exec_time(0); } void print_exec_timer() { set_exec_time(1); }
źródło
Wysoka rozdzielczość jest względna ... Patrzyłem na przykłady i przeważnie odpowiadają one milisekundom. Jednak dla mnie ważny jest pomiar mikrosekund. Nie widziałem rozwiązania niezależnego od platformy przez mikrosekundy i pomyślałem, że coś takiego jak poniższy kod będzie przydatne. Na razie mierzyłem czas tylko w systemie Windows i najprawdopodobniej dodam implementację gettimeofday (), robiąc to samo w systemie AIX / Linux.
#ifdef WIN32 #ifndef PERFTIME #include <windows.h> #include <winbase.h> #define PERFTIME_INIT unsigned __int64 freq; QueryPerformanceFrequency((LARGE_INTEGER*)&freq); double timerFrequency = (1.0/freq); unsigned __int64 startTime; unsigned __int64 endTime; double timeDifferenceInMilliseconds; #define PERFTIME_START QueryPerformanceCounter((LARGE_INTEGER *)&startTime); #define PERFTIME_END QueryPerformanceCounter((LARGE_INTEGER *)&endTime); timeDifferenceInMilliseconds = ((endTime-startTime) * timerFrequency); printf("Timing %fms\n",timeDifferenceInMilliseconds); #define PERFTIME(funct) {unsigned __int64 freq; QueryPerformanceFrequency((LARGE_INTEGER*)&freq); double timerFrequency = (1.0/freq); unsigned __int64 startTime; QueryPerformanceCounter((LARGE_INTEGER *)&startTime); unsigned __int64 endTime; funct; QueryPerformanceCounter((LARGE_INTEGER *)&endTime); double timeDifferenceInMilliseconds = ((endTime-startTime) * timerFrequency); printf("Timing %fms\n",timeDifferenceInMilliseconds);} #endif #else //AIX/Linux gettimeofday() implementation here #endif
Stosowanie:
PERFTIME(ProcessIntenseFunction()); or PERFTIME_INIT PERFTIME_START ProcessIntenseFunction() PERFTIME_END
źródło