2017-01-24 19 views
0

В настоящее время я работаю над компилятором из пользовательского DSL на Java, одновременно выполняя некоторые оптимизации производительности в процессе. Моя самая большая проблема заключается в том, что не существует академических ресурсов, которые можно найти о том, что JIT-компиляторы будут делать в отношении оптимизации (проходов) или в какой степени они это сделают (например, комплексный отказ от мертвого кода, см. Пример ниже). Есть много сообщений в блогах, в которых JIT-Compilers не будет делать все оптимизации, которые AOT-Compiler сделает из-за определенных ограничений по времени, но никто не упоминает, что это на самом деле означает. Есть общее правило? Нужно ли мне погружаться в, например, источник OpenJDK C++, чтобы понять это? Есть ли какие-либо исследования об этом? И если этого не происходит, есть ли, по крайней мере, надежный источник информации о том, какие оптимизаторы JVM JIT делают? Последние ресурсы, которые я нашел, касаются Java 5, который довольно устарел (http://www.oracle.com/technetwork/java/5-136747.html)Ограничения JVM JIT-компиляторы Оптимизация

Вот упрощенный пример сценария «сложного уничтожения мертвого кода», который я нашел, что JVM JIT не сможет устранить, учитывая переменную cells_S_S_S не используются в любом месте (имейте в виде, что это авто-генерируемый код):

List<List<List<Cell>>> cells_S_S_S = new ArrayList<>(pla_S.size()); 
... 
for (int pla_S_itr_45 = 0; pla_S_itr_45 < pla_S_size_45; ++pla_S_itr_45) { 
     ... 
     List<List<Cell>> cells_S_S = new ArrayList<>(tmpVarIf20_S.size()); 
     for (int tmpVarIf20_S_itr_44 = 0; tmpVarIf20_S_itr_44 < tmpVarIf20_S_size_44; ++tmpVarIf20_S_itr_44) { 
      ... 
      List<Cell> cells_S = _state.getCells(); 
      ... 
      cells_S_S.add(cells_S); 
     } 
     ... 
     cells_S_S_S.add(cells_S_S); 
    } 

Такого рода ,, вложенного мертвого-кода»не был устранен который мне сказал, выполняет оптимизации на моем своя.

Вкратце: я хочу знать, что JVM JIT способен на то, чтобы я мог сосредоточить свою собственную оптимизацию на правильных областях.

+0

Возможно, эта ссылка интересна: https://wiki.openjdk.java.net/display/HotSpot/PerformanceTacticIndex (сайт вики сегодня загружается очень медленно, поэтому вы можете использовать сайты архивации). –

+0

Спасибо за ваш вклад! К сожалению, это не помогает мне вообще, так как нет точной информации и ссылок на эту страницу. Кажется, это просто огромный черный ящик. – naze

+0

Несмотря на то, что вопрос интересный, он не соответствует теме «Переполнение стека», поскольку он слишком широк и/или запрашивает ресурс вне сайта. – apangin

ответ

2

Я хочу знать, что JVM JIT способен на то, чтобы я мог сосредоточить свои собственные оптимизации на правильных областях.

Простой ответ: Не надо.

Вы должны рассмотреть две вещи:

  1. Да, двигатель Oracle HotSpot JVM JIT выполняет широкий спектр оптимизаций в течение нескольких проходов. Некоторые из перечисленных вами (удаление мертвых кодов, inlining, де-виртуализация и т. Д.) И многие другие.
    Важно отметить, что поведение JIT Engine не равно , а JVM от другой компании ведут себя по-разному. Я никогда не видел документа, в котором подробно описывается, как HotSpot принимает свои решения внутри страны или поддерживается список оптимизаций, и я очень сомневаюсь, что такой документ существует (а не от Oracle, а не от сообщества). Вы можете погрузиться в источник HotSpot VM, но:
  2. HotSpot постоянно пытается определить горячие точки в вашем приложении и недетерминированным способом решить, что нужно сделать, как это сделать в текущем контексте (для более жарких методов имеет смысл применять дорогостоящие оптимизации), и какие jitted методы нужно отбрасывать и, возможно, перекомпилировать.
    Состояние вашего приложения нестабильно, и JIT-движок постоянно решает, что с ним делать, и выбирает, какой набор оптимизаций будет применяться в зависимости от текущей среды.

Вы пытаетесь оптимизировать код, который вы передаете из своего DSL для конкретного поведения JIT, но каждое допущение, которое вы делаете, может быть действительным для одного конкретного запуска, но не для другого. Или не будет действительным больше через некоторое время, когда jit-двигатель решит отказаться от jitted-версии вашего метода для освобождения памяти или скомпилировать его снова с разными результатами.

Единственная разница между JIT и AOT заключается в том, что для последних есть no ограничения по времени, поэтому вы пытаетесь создать лучший код, который вы можете, для некоторой степени качества.

+0

Я вижу вашу точку зрения относительно недетерминированности JIT. Но в его нынешнем виде я более чем удивлен тем, что никаких научных исследований/документов об этом вообще нет, даже для конкретной версии Java/OpenJDK. Также я не хочу оптимизировать JIT для создания лучшего кода, но оптимизировать части моей программы, которые JIT по своей сути не может оптимизировать (см. Цепочку комментариев на главном сообщении о том, почему JIT не может, dead-code -оптимизируйте «мой пример»), но это похоже на более общую проблему оптимизации, с которой столкнулись даже AOT-компиляторы. – naze

+1

Согласен, я искал такую ​​документацию лет назад и не мог найти ничего исчерпывающего, самые интересные биты о деталях JIT были разбросаны по множеству блогов и статей. Я предполагаю, что, учитывая низкий объем участников (главным образом, во время выполнения), они никогда не чувствовали необходимости публиковать документ, описывающий внутренний дизайн и выбор, который они делали в прошлом , –