【问题标题】:Does n >> 3 or n & 3 offer any advantage over n/8 or n % 8 respectively?n >> 3 或 n & 3 是否分别比 n/8 或 n % 8 提供任何优势?
【发布时间】:2020-03-16 00:02:03
【问题描述】:

在我的程序内存和 cpu 时间中,这个计算也将每秒进行大约 50000 次。如果在算术上使用位运算符,是否会提高性能?

【问题讨论】:

  • @ElliottFrisch “它们的表现相同” 是吗?你有参考基准吗?
  • 值得注意的是,它们不会产生相同的结果。而且 50,000 Hz 也不是很多,至少在某些嵌入式之外。
  • 我的建议是选择看起来最自然(也是最正确!)的版本,然后让 JIT 编译器的优化器来选择更快的版本。请注意,最佳代码可能取决于硬件。特别是如果您的目标平台具有不同的 ISA。
  • 我知道这是典型的陈述,但它太重要了,不能每次都发布:编写可读的代码。不要进行过早的优化,您最终可能会产生较慢的代码并牺牲可读性。衡量你的表现,只有当你在那个地方发现了一个真正的问题,然后才进行优化,然后用另一个衡量标准来确认你没有让问题变得更糟。
  • @ElliottFrisch 它是 signed 余数和 signed 除法,即使经过优化,它们最终也比按位与和移位更复杂。因此,您基本上是在说 AND 指令和 AND 指令加上一些额外内容之间几乎没有区别。差异小到足以使准确的基准测试变得棘手,但现在移动球门柱为时已晚。

标签: java real-time


【解决方案1】:

这不太可能产生任何影响;几十年来,CPU 都不会关心这种事情。

一般来说,如果您在没有任何实际迹象表明性能低于您的需求之前就担心性能,那么您的日子就不好过了。现代硬件,以及 JVM 的优化代码非常复杂,甚至 JVM 性能工程师自己都记录在案,以至于他们很难仅仅查看代码,然后猜测是否可以通过尝试替换等廉价技巧使其更快除以位移。

解决方案是永远不要从事此类事情:如果您有性能需求,请将其写下来,并使用分析器找出查找位置(因为通常 99% 的 CPU 资源都花在了 1% 或更少的代码——所以在开始性能测量之前,您需要知道要测量什么)。

了解后,使用JMH 实际测试性能。这就是它的用途。

IF JMH 告诉你​​ bitshift 更快(我非常怀疑),知道这个结果不一定会转化为其他 CPU 架构。

【讨论】:

    【解决方案2】:

    我对进行一些简单测试的观察表明是的,它会有所作为。不,我没有使用 JMH,所以我知道我会得到一些回击。但无论测试的顺序如何,总是观察到按位运算更快。我不能说更快是否等于优势,但除非证明不是这样,否则我会在可能的情况下继续支持他们。

    • (i&1) == 1i%2 == 1
    • i>>3i/8

    我之前在 API 代码中看到过这一点,记录为更快,但我没有尝试过。

    • a<<6 + a<<5 + a<<2 vs a*100

    然后还有这个用于位移。

    Arithemetic Benchmark

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2021-12-20
      • 1970-01-01
      • 2011-08-03
      • 2010-09-08
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多