为什么执行结果在发布模式和调试模式上有很大的不同?

时间:2018-11-01 06:21:31

标签: c performance-testing

# 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模式下运行时,还没有结束。

我知道发布模式很快,但是怎么能这么快呢?

2 个答案:

答案 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;

同样,可以优化第二个循环块。

由于未使用ab,因此可以完全删除循环。

因此您的整个程序可能被优化为代表以下内容的东西:

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左右的数字将为您提供合理,可衡量的时间。