Вопрос: Обработка исключений в Java на самом деле медленная?
Обычная мудрость, а также множество результатов Google говорят, что исключительная логика не должна использоваться для нормального потока программ в Java. Обычно приводятся две причины:
- он действительно медленный - даже на порядок медленнее обычного кода (приведенные причины варьируются),
а также
- это грязно, потому что люди ожидают, что только ошибки будут обработаны в исключительном коде.
Этот вопрос касается №1.
В качестве примера эта страница описывает обработку исключений Java как "очень медленную" и связывает медленность с созданием строки сообщения об исключении - "эта строка затем используется при создании объекта исключения, который вызывается. Это не быстро". В статье " Эффективная обработка исключений в Java" говорится, что "причина этого связана с аспектом создания объекта обработки исключений, что делает тем самым исключение метаданных исключениями". Другая причина в том, что генерация трассировки стека - это то, что замедляет ее.
Мое тестирование (с использованием Java 1.6.0_07, Java HotSpot 10.0, на 32-разрядном Linux) указывает, что обработка исключений не медленнее обычного кода. Я попытался запустить метод в цикле, который выполняет некоторый код. В конце метода я использую логическое значение, чтобы указать, следует ли возвращать или бросать. Таким образом, фактическая обработка одинакова. Я пытался использовать методы в разных порядках и усреднять время тестирования, думая, что это, возможно, прогревало JVM. Во всех моих тестах бросок был как минимум быстрым, чем возврат, если не быстрее (до 3,1% быстрее). Я полностью открыт для возможности того, что мои тесты были неправильными, но я не видел ничего на пути к образцу кода, сравнению тестов или результатов за последний год или два, которые показывают обработку исключений в Java, на самом деле медленный.
Что привело меня по этому пути, я использовал API, который мне нужен, чтобы использовать исключения, которые являются частью обычной логики управления. Я хотел исправить их в их использовании, но теперь я, возможно, не смогу. Будут ли я вместо этого хвалить их на их будущее мышление?
В статье " Эффективная обработка исключений Java" в компиляции "точно вовремя" авторы полагают, что наличие только обработчиков исключений, даже если исключений не было, достаточно, чтобы компилятор JIT не смог правильно оптимизировать код, тем самым замедляя его, Я еще не тестировал эту теорию.