Попробуйте Catch Performance Java

Сколько дольше (в наносекундах) делает попытку try-catch при перехвате исключения вместо проверки (если сообщение имеет производительность типа HashMap для поиска)?

    try {
        timestamp = message.getLongField( MessageField.TIMESTAMP );
    } catch (MissingDataException e) {
        //Not all messages contain this field
    }

против

if (message.contains(MessageField.TIMESTAMP))
    timestamp = message.getLongField( MessageField.TIMESTAMP );

Ответ 1

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

  • Исключения являются ДОРОГИМИ! Должна быть создана трассировка стека (если она используется, например, журнал и т.д.) И обработанное управление потоком
  • Исключения не должны использоваться для управления потоком. Исключения для "исключительных"
  • Исключения - это кодный способ сказать: "Я не могу справиться с этой ситуацией, и я сдаюсь... вы справляетесь с этим!", но здесь вы можете справиться с этим... поэтому обрабатывайте его

Ответ 2

Ответ "намного дольше". Исключения являются медленными по сравнению с проверкой из-за времени для создания stacktrace.

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

Ответ 3

Еще один ответ: "Кого волнует!". Это неправильно!

В любом случае, если вы хотите сравнить его, используйте https://github.com/google/caliper

Ответ 4

Хотелось бы количественно оценить это...

В буквальном смысле это невозможно. Не в наносекундах... потому что это зависит от платформы исполнения. И даже в процентном отношении.

Время зависит в основном от времени, затраченного на захват трассировки стека, и это зависит от того, насколько глубок стек, когда генерируется исключение. И это лишь одна из причин, по которой использование исключений Java вместо обычных условных операторов - действительно плохая идея.

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


Если вам действительно нужны некоторые (ИМО, бессмысленные и в значительной степени бессмысленные) номера, вам нужно будет сделать свой собственный бенчмаркинг. Удачи.