Оптимизация оператора переключения Java во многих случаях? - PullRequest
7 голосов
/ 04 ноября 2011

В настоящее время я использую оператор switch для обработки типов входящих сообщений, для которых существует около 20 различных случаев. Некоторые из этих случаев на несколько порядков более вероятны, чем другие.

Может ли компилятор горячей точки оптимизировать порядок изучения случаев, чтобы найти правильный вариант выполнения, или я должен структурировать свой код так, чтобы самые распространенные случаи появлялись первыми:

switch(messageType)
{
    case MOST_COMMON:
        // handle it
        break;

...
    case LEAST_COMMON:
        // handle it
        break;
}

Все случаи являются взаимоисключающими.

Будет ли лучше использовать шаблон стратегии и поиск по карте для типа сообщений?

Производительность является ключевой проблемой, так как я обрабатываю тысячи сообщений в секунду и пытаюсь сократить затраты на создание объектов и вызовы методов.

Большое спасибо,

Chris

Edit: Спасибо за указатели. messageType - это int с узким диапазоном значений, поэтому похоже, что он будет компилироваться в байт-код «TableSwitch», поэтому нет необходимости переупорядочивать регистры.

Соответствующая часть спецификации JVM находится здесь http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14942

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Если вы не уверены, что этот оператор переключения вызывает у вас проблемы с производительностью, я бы посоветовал вам преждевременно оптимизировать.Также проверьте принятый ответ на этот вопрос .

3 голосов
/ 04 ноября 2011

Если значения являются enum значениями или плотно распределены int значения, то смешивание с порядком не поможет вам, как только JIT-компилятор включит его, чтобы превратить все в справочную таблицу.

Если вы используете строковые переключатели Java7 или редко распределенные значения, то наиболее распространенные должны идти первыми, поскольку они превращаются в каскадный набор if -подобных операций тестирования и ветвления.

1 голос
/ 04 ноября 2011

Оператор switch - это поиск, чтобы определить, к какому блоку кода перейти.Это не серия проверок if / else, и порядок объявления блоков не влияет на производительность.т. е. все значения регистра проверяются одинаково и сразу.

Псевдокод, такой же, как (для небольшого диапазона значений int)

goto case_label[messageType.ordinal()];

Для больших значений int диапазон aдругая структура таблицы используется.(Я предполагаю, что это хеш-таблица)

Процессор может использовать прогнозирование ветвлений и, если один случай гораздо более распространен, чем другие, он может динамически оптимизировать выполнение.

...