TL; DR - нет ни одного правильного ответа. Это зависит от множества факторов. Сравнительный анализ вашего реального приложения - единственный способ получить надежный ответ.
Вот некоторые из вопросов:
С одной стороны, версия, использующая lambdas сохраняет оператор if
.
С другой стороны, версия, использующая вызов метода, потенциально может быть встроена компилятором JIT. (Эти лямбда-вызовы не могут быть встроенными, потому что в разные моменты времени сайт вызова может вызывать разные лямбды.)
С другой стороны, если // perform algorithm
достаточно сложный, он будет слишком большим для встроенного.
С другой стороны, если algorithm
слишком велик для встроенного, возможно стоимость теста if
будет незначительной.
С другой стороны С другой стороны, тест if
может оказаться дешевле, чем вы думаете. Например:
- Если код скомпилирован JIT после перехода в состояние
isLoadGame == true
, то статистика может дать указание JIT-компилятору оптимизировать его в случае успеха теста. - (Аппаратное) предсказание ветви может приспособиться к модальному поведению этого теста.
С другой стороны, мне не ясно, какие версии должны делать простые вызовы или виртуальные вызовы. Или может ли JIT-компилятор оптимизировать виртуальные вызовы. Я просто не знаю. (Изучение байт-кодов дало бы частичный ответ.)
Тогда возникают проблемы с различными версиями JIT-компилятора, различными аппаратными ISA, различными аппаратными реализациями.
Короче говоря, есть и слишком множество факторов, позволяющих предсказать, какой подход будет эффективнее в действительности.
Это также означает, что микробанкинг вряд ли будет полезным. Многие из вышеперечисленных факторов будут критически зависеть от реального кода приложения и способа запуска приложения. Вам нужно будет сравнить реальное приложение, чтобы получить значимые результаты.