Беспокоясь о производительности моего веб-приложения, мне интересно, какой из операторов if / else или switch лучше с точки зрения производительности?
124
Беспокоясь о производительности моего веб-приложения, мне интересно, какой из операторов if / else или switch лучше с точки зрения производительности?
if
и т. Д.Ответы:
Это микрооптимизация и преждевременная оптимизация - зло. Скорее беспокойтесь о читабельности и ремонтопригодности рассматриваемого кода. Если
if/else
склеено более двух блоков или их размер непредсказуем, то вам стоит подумать оswitch
заявлении.В качестве альтернативы вы также можете использовать Polymorphism . Сначала создайте интерфейс:
И получить все реализации в некоторых
Map
. Вы можете сделать это статически или динамически:Наконец, замените
if/else
илиswitch
на что-то вроде этого (оставив в стороне тривиальные проверки, такие как нулевые указатели):Это может быть немного меньше
if/else
илиswitch
, но код, по крайней мере, намного лучше обслуживается.Когда вы говорите о веб-приложениях, вы можете использовать ее в
HttpServletRequest#getPathInfo()
качестве клавиши действия (в конечном итоге напишите еще код, чтобы отделить последнюю часть pathinfo в цикле, пока действие не будет найдено). Вы можете найти здесь похожие ответы:Если вы беспокоитесь о производительности веб-приложений Java EE в целом, эта статья также может оказаться полезной для вас. Есть и другие области, которые дают гораздо больший прирост производительности, чем простая (микро) оптимизация исходного кода Java.
источник
Я полностью согласен с мнением, что преждевременной оптимизации следует избегать.
Но верно, что виртуальная машина Java имеет специальные байт-коды, которые можно использовать для switch ().
См. Спецификацию WM ( переключатель поиска и переключатель таблиц )
Так что может быть некоторый прирост производительности, если код является частью графика производительности ЦП.
источник
Крайне маловероятно, что if / else или переключатель станут источником проблем с производительностью. Если у вас проблемы с производительностью, вам следует сначала провести анализ профилирования производительности, чтобы определить, где находятся медленные места. Преждевременная оптимизация - это корень всех зол!
Тем не менее, можно говорить об относительной производительности switch по сравнению с if / else с оптимизацией компилятора Java. Прежде всего отметим, что в Java операторы switch работают с очень ограниченным доменом - целыми числами. В общем, вы можете просмотреть оператор switch следующим образом:
где
c_0
,c_1
, ..., иc_N
являются целыми числами , которые являются мишенями заявления переключателя, и<condition>
должны разрешаться в выражение целого.Если это множество «плотное», то есть (max (c i ) + 1 - min (c i )) / n> α, где 0 <k <α <1, где
k
больше некоторого эмпирического значения, a таблица переходов может быть сгенерирована, что очень эффективно.Если этот набор не очень плотный, но n> = β, двоичное дерево поиска может найти цель в O (2 * log (n)), что тоже по-прежнему эффективно.
Во всех остальных случаях оператор switch столь же эффективен, как и эквивалентная серия операторов if / else. Точные значения α и β зависят от ряда факторов и определяются модулем оптимизации кода компилятора.
Наконец, конечно, если доменом
<condition>
не являются целые числа, оператор switch совершенно бесполезен.источник
Используйте переключатель!
Ненавижу поддерживать блоки if-else! Пройдите тест:
Мой стандартный код C # для тестирования
источник
switch
es?Я помню, как читал, что в байт-коде Java есть 2 вида операторов Switch. (Я думаю, что это было в «Настройка производительности Java». Одна из них - очень быстрая реализация, которая использует целочисленные значения оператора switch, чтобы знать смещение кода, который будет выполняться. Для этого потребуется, чтобы все целые числа были последовательными и в четко определенном диапазоне Я предполагаю, что использование всех значений Enum тоже попадет в эту категорию.
Я согласен со многими другими плакатами ... может быть преждевременно беспокоиться об этом, если только это не очень-очень горячий код.
источник
switch
несколько различных способов, некоторые из которых более эффективны, чем другие. В целом эффективность будет не хуже, чем у простой «if
лестницы», но есть достаточно вариаций (особенно с JITC), поэтому трудно быть намного более точным.Согласно Клиффу Клик в его выступлении на Java One 2009 Ускоренный курс современного оборудования :
Вы можете получить его полные слайды здесь .
Клифф приводит пример (завершение слайда 30), показывающий, что даже когда ЦП выполняет переименование регистров, предсказание ветвлений и спекулятивное выполнение, он может запустить только 7 операций за 4 тактовых цикла, прежде чем потребуется блокировка из-за двух промахов в кэше, которые требуют 300 тактов для возврата.
Поэтому он говорит, что для ускорения вашей программы вы должны обращать внимание не на такие второстепенные проблемы, а на более серьезные, например, выполняете ли вы ненужные преобразования формата данных, такие как преобразование «SOAP → XML → DOM → SQL →… "который" передает все данные через кеш ".
источник
В моем тесте лучшая производительность - ENUM> MAP> SWITCH> IF / ELSE IF в Windows7.
источник
Time taken for String in Switch :3235 Time taken for String in if/else if :3143 Time taken for String in Map :4194 Time taken for String in ENUM :2866
Я не могу себе представить, что для большинства
switch
и большинстваif-then-else
блоков есть какие-либо заметные или существенные проблемы, связанные с производительностью.Но вот в чем дело: если вы используете
switch
блок, само его использование предполагает, что вы включаете значение, взятое из набора констант, известных во время компиляции. В этом случае вам действительно не следует использоватьswitch
операторы вообще, если вы можете использовать ихenum
с методами, зависящими от константы.По сравнению с
switch
оператором перечисление обеспечивает лучшую безопасность типов и код, который легче поддерживать. Перечисления могут быть спроектированы таким образом, что если к набору констант добавляется константа, ваш код не будет компилироваться без предоставления специфичного для константы метода для нового значения. С другой стороны, если вы забыли добавить новый блокcase
вswitch
блок, это может быть обнаружено только во время выполнения, если вам посчастливилось настроить свой блок на создание исключения.Производительность между
switch
иenum
специфичным для константы методом не должна существенно отличаться, но последний более читабелен, безопаснее и проще в обслуживании.источник