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



我有一些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 个实际上要快得多。

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)

但不是你自己的方法。

最新更新