在大多数(甚至可能是所有)CPU上,如果碰巧使用2的幂,那么左右移位显然比乘法和除法运算要快.然而,它会降低一些读者和一些算法的代码清晰度.对于性能来说,位转移真的是必要的吗?或者我可以期望编译器或VM注意到这种情况并对其进行优化(特别是,当幂-2是一个文本时)?我主要对Java和Java感兴趣.NET行为,但也欢迎深入了解其他语言实现.
在大多数(甚至可能是所有)CPU上,如果碰巧使用2的幂,那么左右移位显然比乘法和除法运算要快.然而,它会降低一些读者和一些算法的代码清晰度.对于性能来说,位转移真的是必要的吗?或者我可以期望编译器或VM注意到这种情况并对其进行优化(特别是,当幂-2是一个文本时)?我主要对Java和Java感兴趣.NET行为,但也欢迎深入了解其他语言实现.
如今,大多数编译器所做的不仅仅是将乘法或除法二次方转换为移位运算.在优化时,许多编译器可以使用编译时间常数优化乘法或除法,即使它不是2的幂.通常,乘法或除法可以分解为一系列移位和加法,如果这一系列操作比乘法或除法更快,编译器将使用它.
对于常数除法,编译器通常可以将运算转换为一个"幻数"乘以一个移位.这可能是一个主要的时钟周期节省,因为乘法通常比除法运算快得多.
Henry Warren's book, Hacker's Delight, has a wealth of information on this topic, which is also covered quite well on the companion website:
另请参见中的讨论(带有一两个链接):
总之,所有这些归结为允许编译器处理微优化的繁琐细节.多年来,你自己的工作比编译器更聪明.