Производительность, когда исключения не генерируются (C ++) - PullRequest
12 голосов
/ 19 сентября 2010

Я уже много читал об исключениях в C ++ и о том, что, в частности, производительность - это сложная тема.Я даже пытался заглянуть под капот g ++, чтобы увидеть, как исключения представляются в ассемблере.

Я программист C, потому что я предпочитаю языки низкого уровня.Некоторое время назад я решил использовать C ++ вместо C, потому что при небольших затратах это может значительно облегчить мою жизнь (классы над структурами, шаблоны и т.генерировать издержки бут только тогда, когда они происходят , потому что для поиска подходящего обработчика исключений требуется длинная последовательность инструкций перехода и сравнения.При нормальном выполнении программы (где нет ошибок) исключительные издержки равны обычной проверке кода возврата.Я прав?

Ответы [ 2 ]

13 голосов
/ 19 сентября 2010

Пожалуйста, посмотрите мой подробный ответ на подобный вопрос здесь .

Затраты на обработку исключений зависят от платформы и зависят от ОС, компилятора и архитектуры ЦП, на которой вы работаете.

Для Visual Studio, Windows и x86 существует плата, даже если исключения не создаются.Компилятор генерирует дополнительный код для отслеживания текущей «области видимости», которая впоследствии используется для определения того, какие деструкторы следует вызывать и где начинать поиск фильтров и обработчиков исключений.Изменения в области действия инициируются try блоками и созданием объектов с деструкторами.

Для Visual Studio, Windows и x86-64 стоимость практически равна нулю, когда исключения не выбрасываются.ABI x86-64 имеет гораздо более строгий протокол обработки исключений, чем x86, и операционная система выполняет тяжелую работу, поэтому самой программе не нужно отслеживать столько информации для обработки исключений.

Когда возникают исключения, стоимость значительна, поэтому они должны происходить только в действительно исключительных случаях.Обработка исключений в x86-64 обходится дороже, чем в x86, потому что архитектура оптимизирована для более распространенного случая исключений.

4 голосов
/ 19 сентября 2010

Вот подробный обзор стоимости обработки исключений, когда на самом деле не генерируются исключения:

http://www.nwcpp.org/old/Meetings/2006/10.html

В общем, в каждой функции, которая использует обработку исключений (имеет либо блоки try / catch, либо автоматические объекты с деструктором) - компилятор генерирует дополнительный код пролога / эпилога для обработки записи регистрации исключения.

Плюс после того, как каждый автоматический объект создан и разрушен, добавляется еще несколько команд на ассемблере (настройте запись регистрации исключения).

Кроме того, некоторые оптимизации могут быть отключены. Особенно это тот случай, когда вы работаете в так называемой «асинхронной» модели обработки исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...