有一天,我遇到了一个奇怪的问题,使用GCC和'-Ofast'优化标志。使用'gcc -Ofast -o fib1 fib1.c'编译下面的程序。使用全局变量递归函数的GCC优化差异
#include <stdio.h>
int f1(int n) {
if (n < 2) {
return n;
}
int a, b;
a = f1(n - 1);
b = f1(n - 2);
return a + b;
}
int main(){
printf("%d", f1(40));
}
当测量执行时间,其结果是:
[email protected] ~ $ time ./fib1
102334155
real 0m0.511s
user 0m0.510s
sys 0m0.000s
现在让我们来介绍我们的程序中的全局变量和编译再次使用 'GCC -Ofast -o FIB2 fib2.c'。
#include <stdio.h>
int global;
int f1(int n) {
if (n < 2) {
return n;
}
int a, b;
a = f1(n - 1);
b = f1(n - 2);
global = 0;
return a + b;
}
int main(){
printf("%d", f1(40));
}
现在的执行时间为:
[email protected] ~ $ time ./fib2
102334155
real 0m0.265s
user 0m0.265s
sys 0m0.000s
新的全局变量并没有做任何有意义。但是,执行时间的差异相当大。
除了问题(1)这种行为的原因是什么,如果(2)最后的表现可以在不引入无意义的变量的情况下实现,那也是很好的。有什么建议么?
感谢 彼得
我怀疑的第一件事就是鱼腥的基准测试方法。 – Lundin
你是否拥有较不积极的优化级别,比如'-O3'或'-O2'? –
一个测量数据不足以形成统计数据 – StoryTeller