首页
社区
课程
招聘
[求助]乘法优化为位移的疑惑
发表于: 2012-4-28 11:02 7386

[求助]乘法优化为位移的疑惑

2012-4-28 11:02
7386
编译环境为VC 2008,速度最优选项。

程序的热点在计算hash上,原来的计算hash的代码是这样的:
hash = hash*131 + *buf;


现在优化为:
hash += (hash << 7) + (hash<<1) + *buf;


但是反汇编后,看到的代码:
imul    esi, esi, 83
add     esi, dword ptr [ecx]


编译器又把两次位移,一次加法操作, 变成了乘法操作。
难道做一次乘法,快过做两次位移,一次加法了?

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2993
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
乘法的实现本质上不就是移位和加法吗?不知道LZ疑惑的是什么。。。
2012-4-28 14:03
0
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
3
擦。。难不成优化空间了
2012-4-28 14:05
0
雪    币: 340
活跃值: (922)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
4
自己用汇编写一份,比较了一下,果然要比乘法慢一丁点儿(几乎差不多)。
要用2次mov,2次shl, 2次add,而imul是在CPU的乘法器内完成的。
这个故事告诉我们,编译器已经够强大了,没事不要瞎优化。要提高性能,多考虑算法层面的问题。
2012-4-28 15:10
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
呵呵,本来我想说 “没事不要瞎优化”的,楼主自己说了,就不怕语言挑衅举报了。
2012-4-28 16:11
0
雪    币: 408
活跃值: (156)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
学习了~~~
2012-4-28 17:18
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
hash += (hash << 7) + (hash<<1) + *buf;
这段代码不是优化,而是复杂化。。。所谓优化,一般就是看生成的指令(机器码)总字节数,越少越好(只是多数,并非绝对)。
2012-4-29 10:31
0
游客
登录 | 注册 方可回帖
返回
//