作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 乘除法的速度
时间Sun Apr 9 15:12:57 2006
※ 引述《lytesha ( <囧>)》之铭言:
: 请问一下 由於在C中乘除法的速度会比较慢
: 如果 ex. i= j*7 ;
: 改成 i= (j<<3)-j;
: 这样还会比要快吗?
不一定
要看 compiler 做得怎样
: 另外请问一下要如何尽量不用乘除法阿
: 我知道如果是2的次方 可用<< or >>来作
: 如果不是呢? 要怎麽办?
: 谢谢
x86 assembly 有一个叫 lea 的指令
原本的用途是帮你计算 indirect addressing 下的记忆体位址
(base + index * scale)
但因为其中有 index * scale 的部分
所以可以拿来计算常数乘法
不过我不会建议你用 assembly 做这种事
因为这是 compiler 的工作
事实上以你前面的例子
我用 gcc 试过的结果是写 i=j*7 会比 i=(j<<3)-j 要快
2的次方我也不建议你用 << 取代星星
一来是 compiler 会帮你做 (如果你用的compiler做不到......扔掉它吧)
二来是用星星别人比较容易看懂 (code 是写给人看的)
至於除法比较难
你可以去看 IA32 optimization reference 之类的文件
里面有一脱拉库的方法
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.62.3.35
1F:推 UNARYvvv:用 LEA .. 妙计! 04/09 17:27