GCC 4.4.0编译器的优化真强大

标签:性能

计算从1加到一百亿,允许溢出:
#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来转换代码页。不过这样就不能输入和显示中文了。

4条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?