Ускоряет ли устройство Даффа код Java? - PullRequest
8 голосов
/ 16 марта 2010

При использовании стандартного компилятора Sun 1.6 и JRE / JIT, будет ли хорошей идеей использовать расширенную развертку, показанную устройством Даффа, для развертывания цикла? Или это заканчивается обфускацией кода без повышения производительности?

Инструменты профилирования Java, которые я использовал, менее информативны о линейном использовании ЦП, чем, скажем, valgrind, поэтому я искал возможности расширить измерения с опытом других людей.

Обратите внимание, что, конечно, вы не можете точно кодировать устройство Даффа, но вы можете выполнить базовую развертку, и это то, что мне интересно.

        short stateType = data.getShort(ptr);
        switch (stateType) {

        case SEARCH_TYPE_DISPATCH + 16:
            if (c > data.getChar(ptr + (3 << 16) - 4)) {
                ptr += 3 << 16;
            }
        case SEARCH_TYPE_DISPATCH + 15:
            if (c > data.getChar(ptr + (3 << 15) - 4)) {
                ptr += 3 << 15;
            }
         ...

вниз через многие другие значения.

Ответы [ 2 ]

24 голосов
/ 16 марта 2010

Неважно, хорошая ли это идея (это не так), потому что она не скомпилируется.

РЕДАКТИРОВАТЬ: Это явно упоминается в JLS :

Трюк, известный как устройство Даффа, может использоваться в C или C ++ для развертывания цикла, но это не допустимый код в языке программирования Java:

Или, более прямо (из того же раздела):

Отличный хак, Том, но он здесь недействителен.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш (слишком) общий вопрос, обычно нет. Как правило, вы должны полагаться на JIT.

9 голосов
/ 16 марта 2010

Вы игнорируете тот факт, что Java компилируется в байт-коды для стековой виртуальной машины. Какой бы низкоуровневый прием оптимизации вы ни предприняли на уровне Java, он в значительной степени неэффективен. Настоящая оптимизация происходит, когда JIT-компилятор создает сборку для целевой архитектуры, процесс, который вы не можете ни контролировать, ни заботиться по большей части.

Вместо этого вы должны оптимизировать изображение гораздо большего размера. Пусть JIT-компилятор обрабатывает низкоуровневые оптимизации.

...