# include <stdio.h>
# include<time.h>
# include <limits.h>
int main() {
clock_t start;
long a = 0;
long b = 0;
start = clock();
for (int i = 0; i < INT_MAX; i++) {
for (int j = 0; j < INT_MAX; j++) {
for (int k = 0; k < INT_MAX; k++) {
for (int q = 0; q < INT_MAX; q++) {
b = 1;
}
}
}
}
printf("%.5f\n", ((float)(clock() - start) / CLOCKS_PER_SEC));
start = clock();
for (int i = 0; i < INT_MAX; i++) {
for (int j = 0; j < INT_MAX; j++) {
for (int k = 0; k < INT_MAX; k++) {
a = 0;
for (int q = 0; q < INT_MAX; q++) {
a += 1;
}
}
}
}
printf("%.5f\n",((float)(clock()-start)/CLOCKS_PER_SEC));
}
当我在发布模式下运行时,这将立即显示结果。 但是当我在Debug模式下运行时,还没有结束。
我知道发布模式很快,但是怎么能这么快呢?
答案 0 :(得分:6)
在优化编译器时,可能会看到以下代码:
for (int i = 0; i < INT_MAX; i++) {
for (int j = 0; j < INT_MAX; j++) {
for (int k = 0; k < INT_MAX; k++) {
for (int q = 0; q < INT_MAX; q++) {
b = 1;
}
}
}
}
可以简单地替换为
b = 1;
同样,可以优化第二个循环块。
由于未使用a
和b
,因此可以完全删除循环。
因此您的整个程序可能被优化为代表以下内容的东西:
int main() {
clock_t start;
start = clock();
printf("%.5f\n", ((float)(clock() - start) / CLOCKS_PER_SEC));
start = clock();
printf("%.5f\n",((float)(clock()-start)/CLOCKS_PER_SEC));
}
答案 1 :(得分:1)
要在this answer上进行扩展,即使您确实使用 a 和 b ,例如嵌套后的 printf 语句中循环,仍然可以优化循环。为什么?
您的循环限制是一个常数,在编译时就知道。因此,编译器实际上会在编译时计算 a 到底会是什么。
尝试从控制台读取一个循环极限值,您将发现现在不再优化第二个循环。
但是不要使用像MAX_INT这样的大数字,因为这将花费非常非常长的时间-即使是在高速计算机上。这就是为什么您观察到这一点:
但是当我在“调试”模式下运行时,还没有结束。
该程序似乎可以永远运行,对吧?
1000左右的数字将为您提供合理,可衡量的时间。