【问题标题】:Optimizing Bitwise for No Method Calls in Java在 Java 中针对无方法调用进行按位优化
【发布时间】:2018-10-11 16:23:59
【问题描述】:

我有一些包含 64 行代码块的 Java:

x = ((some_long_bitwise_expression) << n |
     (same_long_bitwise_expression) >>> (32 - n))

其中“长表达式”在每一行中都是相同的,但从一行到下一行会发生变化。通常这只会使用方法调用来计算表达式,然后单独执行位旋转。但我想知道这是否可以优化,从而消除 64 个方法调用。

那么有什么方法可以计算和保存表达式乘积,然后在 OR 的另一边引用它?

如果我这样做:

int t;

x = ((t = (some_long_bitwise_expression)) << n |
     (t) >>> (32 - n))

这实际上似乎有效。但它是合法的 Java 吗?

更新:

经过一些简单的性能测试后,我发现对 64 行代码中的每一行使用 3 种不同方法调用中的 1 种实际上要快得多。

【问题讨论】:

  • 完全合法。
  • 这种方式比在单独的行上设置t 更好吗?
  • 或者只写一个单独的rotate函数
  • @phuclv 不,请改用Integer.rotate*,因为它是内在函数,并且使用汇编程序旋转指令进行优化(与您自己的方法不同)。

标签: java optimization conditional bit-manipulation


【解决方案1】:
int t;

x = ((t = (some_long_bitwise_expression)) << n |
     (t) >>> (32 - n))

当然,你可以做这种混淆,但并不比

int t = some_long_bitwise_expression;    
x = (t << n) | (t >>> (32 - n));

这更清楚。而且,最后一个表达式等价于

x = (t << n) | (t >>> -n);

因为移位距离对整数取模 32。所以你可以写

x = rotateLeft(some_long_bitwise_expression, n)

使用您自己的旋转方法并具有非常易读的表达式。您甚至可以希望使用旋转汇编指令对其进行优化,但事实并非如此。 Oracle JVM 优化

x = Integer.rotateLeft(some_long_bitwise_expression, n)

但不是你自己的方法。

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 2013-06-25
    • 1970-01-01
    • 2011-05-14
    • 2011-08-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多