在Java中按位优化无方法调用

时间:2018-10-10 21:40:24

标签: java optimization conditional bit-manipulation

我有一些Java,其中包含64行,如下所示:

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 个答案:

答案 0 :(得分:0)

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)

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

x = Integer.rotateLeft(some_long_bitwise_expression, n)

但不是您自己的方法。