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

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

6 голосов
/ 24 ноября 2011

Сколько времени (в наносекундах) занимает попытка перехвата при перехвате исключения, а не при проверке (при условии, что сообщение имеет тип производительности 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 );

Ответы [ 4 ]

23 голосов
/ 24 ноября 2011

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

  • Исключения ДОРОГИ!Необходимо создать трассировку стека (если используется, например, в журнале и т. Д.) И обработано специальное управление потоком
  • Исключения не следует использовать для управления потоком. Исключениями являются «исключительные»
  • Исключениями являютсякод говорит: «Я не могу справиться с этой ситуацией, и я сдаюсь ... вы справляетесь с этим!», но здесь вы можете справиться с этим… так что справьтесь с этим
3 голосов
/ 24 ноября 2011

Другой ответ: «Кому интересно!».Это неправильно!

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

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

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

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

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

Хотелось бы дать количественную оценку этому ...

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

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

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


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

...