在大多数(甚至可能是所有)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:

另请参见中的讨论(带有一两个链接):

  • 100

总之,所有这些归结为允许编译器处理微优化的繁琐细节.多年来,你自己的工作比编译器更聪明.

.net相关问答推荐

为什么在WinForm应用程序中创建组件类椭圆会在www.example.com中没有响应

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

[x.x.x,)在Packages.lock.json依赖项中是什么意思?

如何在 .net MAUI 中删除不需要编译的平台?

判断内部异常的最佳方法?

为什么这个多态 C# 代码会打印它的功能?

如何在 C# 中创建表达式树来表示String.Contains("term")?

如何在 EF 代码优先中禁用链接表的级联删除?

OpenCV的.Net(dotNet)包装器?

HttpClient 和使用代理 - 不断得到 407

.NET 中工作线程和 I/O 线程的简单描述

将跟踪输出重定向到控制台

属性应该与其类型同名吗?

将属性序列化为元素中的 Xml 属性

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

资源(.resx)文件有什么好处?

为什么 Roslyn 中有异步状态机类(而不是 struct )?

将 SignalR 2.0 .NET 客户端重新连接到服务器集线器的最佳实践

obj 文件夹是为了什么而生成的?

作者主签名的时间戳发现了一个建链问题:UntrustedRoot: self-signed certificate in certificate chain