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