在 Java 中,移位比乘法和除法更快吗? .NET?[已关闭]

2022-08-31 14:25:38

如果您碰巧使用2的幂,那么在大多数(甚至所有)CPU上,左右移动位显然比乘法和除法运算更快。但是,它可能会降低某些读者和某些算法的代码清晰度。位移是否真的需要性能,或者我是否可以期望编译器或VM注意到这种情况并对其进行优化(特别是当2的幂是文字时)?我主要对Java和.NET行为感兴趣,但也欢迎对其他语言实现的见解。


答案 1

几乎任何值得盐的环境都会为您优化这一点。如果没有,你就有更大的鱼要炸。说真的,不要再浪费一秒钟来思考这个问题。当您遇到性能问题时,您将知道。运行探查器后,您将知道导致它的原因,并且应该相当清楚如何修复它。

你永远不会听到任何人说“我的应用程序太慢了,然后我开始随机替换,一切都修好了!性能问题通常通过找到一种方法来减少一个数量级的工作来解决,而不是通过找到一种方法将相同的工作提高1%。x * 2x << 1


答案 2

如今,大多数编译器所做的不仅仅是转换乘法或除以二的幂来平移运算。优化时,许多编译器可以使用编译时常量优化乘法或除法,即使它不是 2 的幂。通常,乘法或除法可以分解为一系列移位和加法,如果该系列操作将比乘法或除法更快,编译器将使用它。

对于常量除法,编译器通常可以将运算转换为乘以“幻数”,后跟移位。这可能是一个主要的时钟周期节省因素,因为乘法通常比除法运算快得多。

亨利·沃伦(Henry Warren)的书《黑客的喜悦》(Hacker's Delight)有大量关于这个主题的信息,在配套网站上也有很好的介绍:

另请参阅以下位置中的讨论(带有一两个链接):

无论如何,所有这些都归结为允许编译器处理微优化的繁琐细节。自从自己进行转换以超越编译器以来,已经有好几年了。


推荐