免费注册 查看新帖 |

Chinaunix

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

[C] c语言的类型转换有多慢【欢迎讨论】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-09 22:19 |只看该作者 |倒序浏览
下面的代码测试了int转换为float的开销:
代码里用到了一个【RUN--ENDRUN】宏,不要奇怪没见过,是我自己写的。
  1. #include"../include/run.h"
  2. void main(void){
  3.     float b,b1,b2,b3,b4;
  4.     int c,c1,c2,c3,c4;
  5.         //RUN和ENDRUN之间的代码会重复执行100000000*9次,每执行一亿次,记录下执行时间,重复9次,取均值
  6.     RUN(100000000,9)//【RUN--ENDRUN】是测试性能的宏,后面贴了源码
  7.     /**b=(float)(exec_count);   
  8.     b1=(float)(exec_count);
  9.     b2=(float)(exec_count);
  10.     b3=(float)(exec_count);
  11.     b4=(float)(exec_count);*/
  12.         c=exec_count;
  13.     c1=exec_count;
  14.     c2=exec_count;
  15.     c3=exec_count;
  16.     c4=exec_count;
  17.     ENDRUN
  18. }
复制代码
gcc -o t t.c -std=c99
./t运行,输出:
332  325  326  326  326  326  325  326  327  
average:326
以上是没有类型转换的性能评价,再把注释部分对调,看类型转换的情况下,输出:
723  710  712  711  709  712  713  710  711  
average:712
---------------------------------------------
测试环境ubuntu12.1,gcc4.7,联想y470
---------------------------------------------


  之所以做这样的测试,是在读《3D游戏编程大师》时候,看到作者说“这样....可以避免浮点数和整数之间的转换,因为作者不信任编译器"。
  在下是新手,请大侠们说说上面的性能差距意味着什么,可以忽略吗?当然也欢迎指出测试代码的不严谨处,因为我对cache,编译优化之类不太懂。
附:run.h
  1. #ifndef RUN_H
  2. #define RUN_H
  3. #include<sys/time.h>
  4. #include<stdio.h>
  5. struct timeval start,end;//global vars,remember not to use repeatly
  6. int var_run_num,run_count,exec_count,timeCost,timeCost_total;//look up
  7. #define RUN(exec_num,run_num)\
  8.     timeCost_total=0;\
  9.     var_run_num=run_num;\
  10.     printf("run start-----------\nexec_strength:%d\n",exec_num);\
  11.     for(run_count=0;run_count<run_num;run_count++){\
  12.         gettimeofday(&start,NULL);\
  13.         for(exec_count=0;exec_count<exec_num;exec_count++){
  14. #define ENDRUN\
  15.         }\
  16.         gettimeofday(&end,NULL);\
  17.         timeCost=(end.tv_sec-start.tv_sec)*1000+(end.tv_usec-start.tv_usec)/1000;\
  18.         timeCost_total+=timeCost;\
  19.         printf("%d  ",timeCost);\
  20.     }\
  21.     printf("\naverage:%d\nrun exit-------------\n",timeCost_total/var_run_num);   
  22. #endif
复制代码

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-03-09 22:25 |只看该作者
关注复杂度和设计合理性比较重要吧... 这...

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2013-03-09 22:27 |只看该作者
编译器在这事上应该没什么责任吧,就是一条FILD指令而已,除非你设置禁止使用FPU。
如果那本书中说的“作者”是John Carmack,那么“不信任”的十有八九是当年Pentium CPU浮点数转换的bug
话说回来,FILD/FSTP之类的指令的确挺慢的,如果你对性能极度关心,确实可以自己搞搞。

论坛徽章:
0
4 [报告]
发表于 2013-03-10 02:02 |只看该作者
即使对“编译优化之类不太懂”,也至少应该知道测试性能时打开编译优化。

果然即使在 Linux 下用 gcc 也阻止不了 void main()。

回到正题,根据 Intel 手册的说法,比较新的机器上位整数转浮点大概要用 3、4 个周期,差不多相当于一次整数乘法的时间。如果用古老的 x87 FPU 指令会更慢。

你这个程序不用再测了,打开编译优化估计循环里就只剩下 gettimeofday 了……

论坛徽章:
0
5 [报告]
发表于 2013-03-10 08:49 |只看该作者
linux_c_py_php 发表于 2013-03-09 22:25
关注复杂度和设计合理性比较重要吧... 这...

我只是想大概看看c语言类型转换的开销

论坛徽章:
0
6 [报告]
发表于 2013-03-10 08:52 |只看该作者
windoze 发表于 2013-03-09 22:27
编译器在这事上应该没什么责任吧,就是一条FILD指令而已,除非你设置禁止使用FPU。
如果那本书中说的“作者 ...

作者是Andre LaMothe

论坛徽章:
0
7 [报告]
发表于 2013-03-10 09:07 |只看该作者
变异老鼠 发表于 2013-03-10 02:02
即使对“编译优化之类不太懂”,也至少应该知道测试性能时打开编译优化。

果然即使在 Linux 下用 gcc 也 ...

"果然即使在 Linux 下用 gcc 也 "这句话我不太懂,能否说浅显点儿?
你可能误会这篇帖子的意思了。我不懂你为什么让我打开编译优化,我并不是想测试这段程序的性能....你说的编译优化是-Ox么?我就是让编译器规规矩矩的汇编每一条指令,才能比较出浮点转换的开销呀。果真让它优化,内层的循环是无意义的,说不定编译器把它扔了都可能呢...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP