GCC 4.4.0编译器的优化真强大
2009 9 19 10:35 AM 2077次查看
#include <stdio.h>
#include <time.h>
int f(int a, int b) {
return a + b;
}
int main()
{
clock_t t = clock();
int k = 0;
int j = 0;
for (; j < 100; ++j)
{
int i = 0;
for(; i < 100000000; ++i)
k = f(k, i);
}
clock_t t2 = clock();
printf("%d", t2 - t);
printf("\n%d", k);
return 0;
}
我故意写成了函数调用的形式,用GCC 3.4.5编译,测试结果是7843毫秒,比实现相同功能的Java快4.19%。当时还以为是Java的计算能力很强,但把函数去掉,改写成k += i,就立刻超过Java 21.6%了,原来是编译器并不能像JIT一样进行这么强大的优化(只能内联成 k = k + i)。
之后花了几个小时,我把mingw的编译器换成了GCC 4.4.0,测试结果为6687毫秒,结果很明显了。
接着我把递增改成递减(即少做了一个CMP操作),4.4.0的测试结果为3937毫秒,3.4.5维持7843不变(很诡异)。
更诡异的是我接着把printf("\n%d", k)也去掉后,4.4.0为0(即关于k的赋值完全被优化掉了,循环都不存在了),3.4.5为4046毫秒(相当于4.4.0的上一个优化结果)。
补充一个发现,GCC 4.4.0的编译信息显示是乱码,可以执行chcp 1252或chcp 65001来转换代码页。不过这样就不能输入和显示中文了。
向下滚动可载入更多评论,或者点这里禁止自动加载。