【发布时间】:2026-02-13 10:45:02
【问题描述】:
如果您碰巧使用 2 的幂,在大多数甚至所有 CPU 上,左右移位显然比乘法和除法运算要快。但是,对于某些阅读器和某些算法,它可能会降低代码的清晰度.位移对于性能真的有必要吗,还是我可以期望编译器或 VM 注意到这种情况并对其进行优化(特别是当 2 的幂是文字时)?我主要对 Java 和 .NET 行为感兴趣,但也欢迎深入了解其他语言实现。
【问题讨论】:
-
为什么要问我们?试试看,你就知道了!双向编写代码,拿出秒表,看看会发生什么。
-
一旦jvm或clr的新版本发布,答案就会失效。或者当有人在嵌入式系统上尝试它时。或者移动CPU。或者GPU。或者满月的时候。或者当行星对齐时。或者......(你明白了。)
-
@Eric 为什么要做的工作比必要的多?在 SO 上提出问题需要 1 分钟,去拿个三明治,然后回来寻找答案和详细解释为什么会这样。
-
我们的观点会比实验中的观点更快地过时。 IE。已经过时或与下一个 cpu vm 等。所以只需尽可能清晰地编写代码,以便优化器能够理解它,从而优化它。
-
尽管下面的答案都发誓现代编译器太聪明了,不会错过这类事情,我自己在 C# 4.0 上的测试表明,对于
int i,声明(i << 3)是 15在发布模式下,比等效的(i * 8)快 % 到 25%。这在各种条件执行流程中是一致的,因此它似乎不是优化侥幸。绝对应该在性能关键的循环中测试自己。 JVM 比 .NET CLR 更优化,所以如果这种特殊的低效率仅适用于 .NET,我不会感到惊讶。
标签: c# java .net optimization bit-manipulation