Попробуйте 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-компилятора есть возможность интенсивно оптимизировать код, связанный с исключениями, при условии, что он может определить, что трассировка стека и исключение, созданное в определенной точке, никогда не будет использоваться.
Если вам действительно нужны некоторые (ИМО, бессмысленные и в значительной степени бессмысленные) номера, вам нужно будет сделать свой собственный бенчмаркинг. Удачи.