Используя компилятор 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;
}
...
вниз через многие другие значения.
Не имеет большого значения, хорошая ли это идея (или нет), потому что она не будет компилироваться.
РЕДАКТИРОВАТЬ: Это явно упоминается в JLS :
Уловка, известная как устройство Даффа, может использоваться в C или C ++ для развертывания цикла, но это недопустимый код в программировании на Java. language:
Или, более прямо (из того же раздела):
Отличный хак на C, Том, но здесь он не действует.
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш (слишком) общий вопрос, обычно нет. Обычно следует полагаться на JIT.
Вы игнорируете тот факт, что Java компилируется в байт-коды для виртуальной машины, ориентированной на стек. Какой бы трюк с низкоуровневой оптимизацией вы ни пытались на уровне Java, в основном он неэффективен. Настоящая оптимизация происходит, когда JIT-компилятор создает сборку для целевой архитектуры, процесс, который вы по большей части не можете ни контролировать, ни о котором не заботитесь.
Вместо этого вы должны оптимизировать для получения гораздо большего изображения. Позвольте компилятору JIT обрабатывать низкоуровневую оптимизацию.