Каково относительное различие в производительности если/еще по сравнению с оператором переключения в Java?

Волнуясь о действиях моего веб-приложения, я задаюсь вопросом, который из того, "если/еще" или оператор переключения лучше расценивает производительность?

118
задан BalusC 29 March 2010 в 15:08
поделиться

5 ответов

используйте функцию mysql DATE_FORMAT с параметром% p

-121--3894579-

В Perl:

use strict;
use warnings;

for my $i (1..1000) {
   open(my $out,">",sprintf("file%04d",$i));
   print $out "some text\n";
   close $out;
}

Почему первые 2 строки? Потому что они являются хорошей практикой, поэтому я использую их даже в таких однокадровых программах, как эти.

С уважением, Предложение

-121--3067635-

Это микрооптимизация и преждевременная оптимизация, которые являются злом. Скорее беспокойтесь о читаемости и ремонтопригодности данного кода. Если имеется более двух блоков , если/иначе склеены или их размер непредсказуем, то можно с большим вниманием рассмотреть оператор switch .

Также можно выбрать Полиморфизм . Сначала создайте интерфейс

public interface Action { 
    void execute(String input);
}

и получите доступ ко всем реализациям в карте . Это можно сделать как статически, так и динамически:

Map<String, Action> actions = new HashMap<String, Action>();

Окончательно заменить if/else или switch чем-то подобным (оставив в стороне тривиальные проверки, такие как nullpointers):

actions.get(name).execute(input);

Он может быть микросмельче, чем if/else или switch , но код хотя бы лучше

Поскольку вы говорите о webapplications, вы можете использовать HttpServletRequest#getPathInfo () как ключ действия (в конечном счете пишут еще некоторый код, чтобы отколоть последнюю часть pathinfo в петле, пока действие не найдено). Вы можете найти здесь подобные ответы:

Если вы беспокоитесь о производительности веб-приложения Java EE в целом, то вы можете найти эту статью также полезно. Есть и другие области, которые дают гораздо большее увеличение производительности, чем только (микро) оптимизация исходного кода Java.

103
ответ дан 24 November 2019 в 01:55
поделиться

Очень маловероятно, что, если / else или коммутатор будет источником ваших проблем производительности. Если у вас проблемы с производительностью, вы должны сначала выполнить анализ профилирования производительности, чтобы определить, где есть медленные пятна. Преждевременная оптимизация является корнем всего зла!

Тем не менее, можно говорить о относительной производительности коммутатора против, если / иначе с оптимизациями компилятора Java. Сначала отметим, что в Java выключатели выключатели работают на очень ограниченном домене - целые числа. В общем, вы можете просмотреть оператор коммутатора следующим образом:

switch (<condition>) {
   case c_0: ...
   case c_1: ...
   ...
   case c_n: ...
   default: ...
}

где C_0 , C_1 , ... и C_n являются целевыми целями. Из оператора выключателя и <Условие> должен разрешить до целочисленного выражения.

  • Если этот набор «плотный» - то есть (Max (C I ) + 1 - мин (C I )) / N> α, где 0 < k <α <1, где k больше, чем некоторая эмпирическое значение, может быть создана таблица прыжка, которая очень эффективна.

  • Если этот набор не очень плотный, но N> = β, двоичное дерево поиска может найти цель в O (2 * log (n)), которая все еще эффективна.

Для всех остальных случаев оператор коммутатора точно так же эффективно, как эквивалентные ряды утверждений, если / else. Точные значения α и β зависят от ряда факторов и определяются модулем оптимизации кода компилятора.

Наконец, конечно, если домен <состояние> не являются целыми числами, переключатель Заявление совершенно бесполезно.

50
ответ дан 24 November 2019 в 01:55
поделиться

Я помню, что читал, что в байтекоде 2 вида выключателей в Java Bytecode. (Я думаю, что это было в «Tuning Performance Performance» - это очень быстрая реализация, которая использует целочисленные значения оператора Switch, чтобы узнать смещение кода, подлежащего выполнению. Это потребует всех целых чисел последовательным и в четко определенном диапазоне , Я предполагаю, что использование всех ценностей энема тоже упадет в эту категорию.

Я согласен со многими другими плакатами, хотя ... возможно, преждевременно беспокоиться, если это не очень очень горячий код.

8
ответ дан 24 November 2019 в 01:55
поделиться

Согласно утесу, щелкнув в своем выходе в 2009 году Java One Talk Ускоренный курс в современном оборудовании :

Сегодня производительность преобладают шаблоны доступа к памяти. Cache Miss по доминированию - память - новый диск. [Slide 65]

Вы можете получить его полные слайды здесь .

Клифф придает пример (заканчивая на слайде 30), показывающий, что даже с процессором выполняет переименование в регистре, прогноз ветвления и спекулятивным выполнением, он может начать 7 операций в 4 тактовых цикла, прежде чем использовать из-за двух кеша промахи, которые берут 300 часы, чтобы вернуться.

Итак, он говорит ускорить свою программу, вы не должны рассматривать этот вид незначительной проблемы, но на более крупных таких, как вы делаете ненужные преобразования формата данных, такие как конвертация «SOAP → XML → DOM → SQL → ... »Что« проходит все данные через кэш ».

8
ответ дан 24 November 2019 в 01:55
поделиться

Я полностью согласен с мнением, что преждевременная оптимизация - что-то, чтобы избежать.

Но это правда, что имеется специальные бассейны, которые могут быть использованы специальные байты ().

См. WM SPEC ( lookupswitch и Tablewitch )

Так что может быть некоторые усиления производительности, если код является частью графика процессора производительности Отказ

120
ответ дан 24 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: