首页
社区
课程
招聘
[讨论]idiv到底有多慢?
发表于: 2008-8-11 09:01 4843

[讨论]idiv到底有多慢?

2008-8-11 09:01
4843
VC代码:
i /= 255;

DEBUG下汇编:
00411A3C  mov         eax,dword ptr [i]
00411A3F  cdq              
00411A40  mov         ecx,0FFh
00411A45  idiv        eax,ecx
00411A47  mov         dword ptr [i],eax

RELEASE下汇编:
0040100F  mov         ecx,dword ptr [i]
00401012  mov         eax,80808081h
00401017  imul        ecx  
00401019  add         edx,ecx
0040101B  sar         edx,7
0040101E  mov         eax,edx
00401020  shr         eax,1Fh
00401023  add         eax,edx
00401025  mov         dword ptr [i],eax

除去数据从i读出和写入的两条指令,DEBUG下忠实的按照字面翻译,只用了8个字节,而RELEASE下化除为乘,却用了19个字节!
idiv的速度真有这么慢么?甚至不惜多一倍多的指令周期数,也要跟idiv说拜拜?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
VS2005已经没有这样的优化了。。。
问题还在于N条相关指令阻碍了流水线。。。
2008-8-11 10:17
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
那BZ的意思是idiv比较快?
优化是多余的么?
2008-8-11 14:12
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
特地在2005上试了一下,发现也还是这样优化的……
2008-8-11 14:24
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
5
你的编译选项?
2008-8-11 15:37
0
雪    币: 11705
活跃值: (975)
能力值: ( LV12,RANK:779 )
在线值:
发帖
回帖
粉丝
6
老式的CPU除法指令比较慢,所以老的编译器考虑把除法优化为移位、乘法组合。
现在的CPU都有快速除法器。一条除法指令优化成几条,效率会变低,没有必要。
2008-8-11 19:05
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
控制台项目RELEASE下编译,未作其他设置。



2008-8-11 21:31
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
8
不懂了..又可以编译出这种的....
2008-8-11 22:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我是新手,这有点难哦,学习中。。。
2008-8-12 00:23
0
游客
登录 | 注册 方可回帖
返回
//