免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3434 | 回复: 2
打印 上一主题 下一主题

不要盲目使用编译器优化选项! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-09 19:56 |只看该作者 |倒序浏览
受Trim的感染,本人刚刚做了一个很有趣的测试,现把测试结果贴在这里供大家参考。
测试环境:Red Hat Linux 8.0 on VMware 4.5.0 build 7174

1.c
  1. #include        <string.h>;
  2. #include        <memory.h>;

  3. #define        STRSZ        32768
  4. #define        TIMES        100000

  5. main()
  6. {
  7.         char        s[STRSZ], t[STRSZ];
  8.         int        i, l;

  9.         memset( s, ' ', STRSZ - 1 );
  10.         s[STRSZ - 1] = 0;
  11.         for ( i = 0; i < TIMES; i ++ )
  12.                 strcpy( t, s );
  13. }
复制代码


编译命令:cc 1.c -o1
测试结果:
  1. real    0m6.293s
  2. user    0m6.281s
  3. sys     0m0.012s
复制代码


2.c
  1. #include        <string.h>;
  2. #include        <memory.h>;

  3. #define        STRSZ        32768
  4. #define        TIMES        100000

  5. main()
  6. {
  7.         char        s[STRSZ], t[STRSZ];
  8.         int        i, l;

  9.         memset( s, ' ', STRSZ - 1 );
  10.         s[STRSZ - 1] = 0;
  11.         for ( i = 0; i < TIMES; i ++ )
  12.                 memcpy( t, s, ( strlen( s ) + 1 ) * sizeof( char ) );
  13. }
复制代码


编译命令:cc 2.c -o2
测试结果:
  1. real    0m2.131s
  2. user    0m2.123s
  3. sys     0m0.006s
复制代码


这个结果说明strlen与memcpy的组合要大大快于strcpy
但有些幽默的是,如果使用编译器的优化选项,得到的结果反而变慢了。

编译命令:cc -O 2.c -o2
测试结果:
  1. real    0m7.927s
  2. user    0m7.920s
  3. sys     0m0.008s
复制代码

论坛徽章:
0
2 [报告]
发表于 2004-03-11 10:35 |只看该作者

不要盲目使用编译器优化选项!

这个帖子应该顶上来。
我在回复trim问题时,作了测试,也发现了这个现象,环境为sco unix5.05,编译器为系统自带的。这个现象从理论上来说不过去,也许是由于实现的bug造成的,FH兄用的应该是gcc,版本可能不是最新的,不妨去http://gcc.gnu.org/查一查对应您的版本的bug reports,要是没有的话可以提给他们,让那帮老外对我们中国程序员刮目相看,呵呵。
另外最重要的教训(也包括我自己)是,凡事都不能想当然,必须作充分测试才能下结论。

论坛徽章:
0
3 [报告]
发表于 2004-03-11 11:04 |只看该作者

不要盲目使用编译器优化选项!

呵呵,我倒是不这么看,机器毕竟是机器,它有它的逻辑。举个例子:
  1. {
  2.    FILE *fi, *fo;

  3.    if ( ( fi = fopen( "F1", "r" ) ) == NULL )
  4.       return -1;
  5.    if ( ( fo = fopen( "F2", "a" ) ) == NULL ) {
  6.       fclose( fi );
  7.       return -1;
  8.    }
  9.    if ( CopyContent( fi, fo ) != 0 ) {
  10.       fclose( fi );
  11.       fclose( fo );
  12.       return -1;
  13.    }
  14.    fclose( fo );
  15.    fclose( fi );
  16.    return 0;
  17. }
复制代码

这段代码用-O选项就会得到很好的优化,而
  1. {
  2.    FILE *fi, *fo;
  3.    int r = -1;

  4.    if ( ( fi = fopen( "F1", "r" ) ) != NULL ) {
  5.       if ( ( fo = fopen( "F2", "a" ) ) != NULL ) {
  6.          r = CopyContent( fi, fo );
  7.          fclose( fo );
  8.       }
  9.       fclose( fi );
  10.    }
  11.    return r;
  12. }
复制代码

再优化只会画蛇添足。

我当初优化那个例子的时候,是希望能在寄存器级优化的,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP