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