Я хотел рассчитать разницу во времени выполнения при выполнении одного и того же кода внутри функции. Однако, к моему удивлению, иногда разница часов равна 0, когда я использую clock()/clock_t для таймера запуска и остановки. Означает ли это, что clock()/clock_t фактически не возвращает количество кликов процессора, затраченного на выполнение задачи?Измерение клещей процессора в C
После небольшого поиска мне показалось, что clock_gettime() возвращает более мелкозернистые результаты. И действительно, да, но вместо этого я получаю некоторое количество nano (?) Секунд. Это дает нам намек на разницу во времени выполнения, но вряд ли точно, насколько точно зависит от количества кликов. Что мне нужно сделать, чтобы это выяснить?
#include <math.h>
#include <stdio.h>
#include <time.h>
#define M_PI_DOUBLE (M_PI * 2)
void rotatetest(const float *x, const float *c, float *result) {
float rotationfraction = *x/*c;
*result = M_PI_DOUBLE * rotationfraction;
}
int main() {
int i;
long test_total = 0;
int test_count = 1000000;
struct timespec test_time_begin;
struct timespec test_time_end;
float r = 50.f;
float c = 2 * M_PI * r;
float x = 3.f;
float result_inline = 0.f;
float result_function = 0.f;
for (i = 0; i < test_count; i++) {
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &test_time_begin);
float rotationfraction = x/c;
result_inline = M_PI_DOUBLE * rotationfraction;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &test_time_end);
test_total += test_time_end.tv_nsec - test_time_begin.tv_nsec;
}
printf("Inline clocks %li, avg %f (result is %f)\n", test_total, test_total/(float)test_count,result_inline);
for (i = 0; i < test_count; i++) {
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &test_time_begin);
rotatetest(&x, &c, &result_function);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &test_time_end);
test_total += test_time_end.tv_nsec - test_time_begin.tv_nsec;
}
printf("Function clocks %li, avg %f (result is %f)\n", test_total, test_total/(float)test_count, result_inline);
return 0;
}
Я использую GCC версии 4.8.4 на Linux 3.13.0-37-родовое (Linux Mint 16)
Вы должны сообщить нам, какой OS/какой компилятор вы используете (GCC/Linux?). – BrunoLevy
Разница в несколько наносекунд не является значимой, возможно, вы могли бы назвать свою функцию большим количеством раз (1 миллион) и измерить разницу таймингов. – BrunoLevy
Я думаю, что я на самом деле уже, @BrunoLevy. Однако я добавил детали, спасибо. – lash