【发布时间】:2014-09-23 22:29:31
【问题描述】:
当我想知道一行 C 代码执行了多长时间时,我注意到了这个奇怪的事情:
int main (char argc, char * argv[]) {
time_t begin, end;
uint64_t i;
double total_time, free_time;
int A = 1;
int B = 1;
begin = clock();
for (i = 0; i<(1<<31)-1; i++);
end = clock();
free_time = (double)(end-begin)/CLOCKS_PER_SEC;
printf("%f\n", free_time);
begin = clock();
for (i = 0; i<(1<<31)-1; i++) {
A += B%2;
}
end = clock();
free_time = (double)(end-begin)/CLOCKS_PER_SEC;
printf("%f\n", free_time);
return(0);
}
执行时显示:
5.873425
4.826874
为什么空循环比第二个有指令的循环使用更多时间?当然,我尝试了很多变体,但每次,一个空循环都比一个包含一条指令的循环花费更多时间。
请注意,我已尝试交换循环顺序并添加一些预热代码,但它根本没有改变我的问题。
我将代码块用作带有 GNU gcc 编译器、linux ubuntu 14.04 的 IDE,并且有一个 2.3GHz 的四核英特尔 i5(我尝试在单核上运行该程序,这不会改变结果)。
【问题讨论】:
-
您的编译器选项是什么?程序集对此有何看法?
-
您认为有多少 C 编译器在优化空循环上花费了大量精力?
-
如果您对代码的性能感兴趣,请放弃
clock()并在发布模式优化位上放松真正的 profiler。 -
由于从未使用过
A的值,因此编译器很可能也将第二个循环设为空,在这种情况下,问题是为什么这两个循环不完全相同。如果在第二个循环之后打印A的值,时间会发生什么变化? -
这是一个不切实际的“玩具”箱,测量不严。没有任何意义可以推导出来。
标签: c performance loops