Понимание того, как избежать последствий мертвого кода
Я читаю образцы JMH, и теперь я нахожусь в разделе о безопасной петле. Вот пример:
@Benchmark
public void measureRight_2() {
for (int x : xs) {
sink(work(x));
}
}
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public static void sink(int v) {
// IT IS VERY IMPORTANT TO MATCH THE SIGNATURE TO AVOID AUTOBOXING.
// The method intentionally does nothing.
}
Но они сделали одно предостережение об этой технике (подчеркните мою).
Иногда стоимость погружения значения в "черную дыру" доминирует в оценке нано-эталонов. В этих случаях можно попытаться сделать "грузило" с помощью ненастраиваемого метода. Этот трюк очень специфичен для виртуальной машины и может использоваться только в том случае, если вы проверяете сгенерированный код (в любом случае, это хорошая стратегия при работе с нано-бенчмарками).
Я не совсем понимаю, что на самом деле здесь относится к конкретной ВМ. Мы используем метод, который не должен быть встроенным. Таким образом, вычисления не могут быть оптимизированы. Какую деталь я пропустил?
1 ответ
Нет гарантии, что:
- Подсказка об отсутствии вставки передается в JVM правильно;
- Подсказка об отсутствии вставки не преднамеренно игнорируется JVM;
- Подсказка об отсутствии вставки не случайно игнорируется JVM;
- Подсказка без вставки работает, но JVM использует перекрестную оптимизацию, которая избегает подготовки аргументов для известных пустых методов;
- Подсказка без вставки работает, но JVM использует некоторую другую магическую оптимизацию, которую вы не можете придумать за 15 минут размышлений;
Это может измениться от семейства JVM к семейству JVM или даже в младших выпусках / исправлениях данного семейства JVM. Вот почему он, как говорят, очень специфичен для ВМ и должен использоваться только в том случае, если вы действительно контролируете, что именно происходит.