【发布时间】:2015-10-07 22:48:24
【问题描述】:
我想计算在函数内执行相同代码时的执行时间差异。然而,令我惊讶的是,当我使用clock()/clock_t 作为启动和停止计时器时,有时时钟差为0。这是否意味着clock()/clock_t 实际上并没有返回处理器在任务上花费的点击次数?
经过一番搜索,在我看来,clock_gettime() 会返回更细粒度的结果。确实如此,但我最终得到了任意数量的纳(?)秒。它暗示了执行时间的差异,但很难准确说明它究竟有多少点击差异。我该怎么做才能找到这个?
#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;
}
我在 Linux 3.13.0-37-generic(Linux Mint 16)上使用 gcc 版本 4.8.4
【问题讨论】:
-
您需要告诉我们您正在使用哪个操作系统/哪个编译器(GCC/Linux?)。
-
几纳秒的差异并不重要,也许您可以多次调用您的函数(100 万次)并测量时间差异。
-
我想我实际上已经这样做了,@BrunoLevy。不过,我添加了详细信息,谢谢。
-
我不够清楚,我的意思是将调用移到循环之外的clock_gettime()。
-
您使用了哪些编译器选项?如果你使用了 -O,编译器可能决定内联函数调用(这可以解释为什么你得到相同的时间)。
标签: c benchmarking clock