LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 988|回复: 6

gcc优化疑问

[复制链接]
发表于 2007-3-31 09:26:30 | 显示全部楼层 |阅读模式
源程序
pisqrt.c

#include <stdio.h>
#include <math.h>

int main(void)
{
        double pi = M_PI;
        double pisqrt;
        long i;

        for(i = 0; i < 100000000; i++)
        {
                pisqrt = sqrt(pi);
        }

        return 0;
}

youxia@zhouxy:~$ gcc -o pisqrt pisqrt.c -lm
youxia@zhouxy:~$ time ./pisqrt

real    0m2.144s
user    0m2.128s
sys     0m0.000s
youxia@zhouxy:~$ gcc -o pisqrt pisqrt.c -lm -O1
youxia@zhouxy:~$ time ./pisqrt

real    0m0.001s
user    0m0.000s
sys     0m0.000s
youxia@zhouxy:~$ gcc -o pisqrt pisqrt.c -lm -O2
youxia@zhouxy:~$ time ./pisqrt

real    0m0.001s
user    0m0.000s
sys     0m0.000s

差距怎么这么大,怎么做到的?
发表于 2007-3-31 11:00:18 | 显示全部楼层
先看看编译出来的汇编代码有啥区别?
回复 支持 反对

使用道具 举报

发表于 2007-3-31 16:00:01 | 显示全部楼层
应该是优化完之后就剩下了一句
pisqrt = sqrt(pi);

因为这个循环不会改变pisqrt的值。
回复 支持 反对

使用道具 举报

发表于 2007-3-31 23:06:30 | 显示全部楼层
gcc-help 的邮件列表里有过一篇讨论编译器究竟做了哪些优化的话题,里面有人提供了一些信息:
  1. -fverbose-asm produces a list of
  2. optimization passes.  The dumps "-da" and "-fdump-tree-all" produce a
  3. lot of files, one per optimization pass, so you can see what each pass
  4. did.  Once you know which pass does what, you can start to look at the
  5. code.
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-4-1 01:59:55 | 显示全部楼层
sqrt(pi)是个常数,优化后应该是编译器直接计算了,然后循环被取消了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-1 03:12:05 | 显示全部楼层
有可能,但是改成for(i = 0; i < 1000000000; i++)后执行时间为

real    0m0.001s
user    0m0.000s
[color="Red"]sys     0m0.004s

加了O2选项

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2007-4-1 20:33:55 | 显示全部楼层
Post by x11
sqrt(pi)是个常数,优化后应该是编译器直接计算了,然后循环被取消了

pi是常数,sqrt(pi)可不是,编译器是不会识别sqrt是个什么东西,然后去计算这个值。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表