Jak zmierzyć czas procesora i zegar ścienny?
Widziałem wiele tematów na ten temat, nawet w przypadku stackoverflow, na przykład:
Jak mogę zmierzyć czas procesora i czas zegara ściennego w systemie Linux / Windows?
Chcę zmierzyć czas procesora i ściany. Chociaż osoba, która odpowiedziała na pytanie w temacie, które napisałem, zaleca używaniegettimeofday
Aby zmierzyć czas ściany, przeczytałem, że zamiast tego lepiej go użyćclock_gettime
. Więc napisałem poniższy kod (czy to jest ok, czy to naprawdę mierzy czas na ścianie, a nie czas procesora? Pytam, bo znalazłem stronę internetową:http://nadeausoftware.com/articles/2012/03/c_c_tip_how_measure_cpu_time_benchmarking#clockgettme gdzie to mówiclock_gettime
mierzy czas procesora ...) Co jest prawdą, a której należy użyć do pomiaru czasu ściany?
Kolejne pytanie dotyczy czasu procesora. Znalazłem odpowiedźclock
jest w tym świetny, więc napisałem do tego przykładowy kod. Ale to nie to, czego naprawdę chcę, ponieważ mój kod pokazuje mi 0 sek. Czasu procesora. Czy jest możliwe dokładniejsze zmierzenie czasu procesora (w sekundach)? Dziękujemy za pomoc (na razie jestem zainteresowany tylko rozwiązaniami Linux).
Oto mój kod:
#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;
}
Skompiluj to tak:
gcc test.c -o test -lrt -lm
i pokazuje mi to:
wall time 0.000424s
cpu time 0.000000s
Wiem, że mogę zrobić więcej iteracji, ale nie o to tu chodzi;)
WAŻNY:
printf("CLOCKS_PER_SEC is %ld\n", CLOCKS_PER_SEC);
przedstawia
CLOCKS_PER_SEC is 1000000