Оптимизация по битам без вызовов методов в Java - PullRequest
0 голосов
/ 11 октября 2018

У меня есть Java, который содержит блок из 64 строк, например:

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

, где «длинное выражение» идентично в каждой строке, но изменяется от одной строки к следующей.Обычно это просто использует вызов метода для вычисления выражения, а затем отдельно выполняет вращение битов.Но мне интересно, может ли это быть оптимизировано и таким образом исключить 64 вызова методов.

Так есть ли способ вычислить и сохранить продукт выражения, а затем ссылаться на него на другой стороне ИЛИ?

Если я просто сделаю:

int t;

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

, похоже, это действительно работает.Но законна ли Java?

ОБНОВЛЕНИЕ:

После некоторых простых тестов производительности я обнаружил, что использование 1 из 3 различных вызовов методов для каждой из 64 строк кода на самом деле было немного быстрее.

1 Ответ

0 голосов
/ 11 октября 2018
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)

, но не ваш собственный метод.

...