В каких путях исключения C++ замедляют код, когда нет никаких исключений thown?

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

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 
54
задан user189169 13 December 2009 в 12:03
поделиться

5 ответов

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

А именно, Visual Studio, при сборке 32 -bit target, зарегистрирует обработчик в каждой функции, которая имеет локальные переменные с нетривиальным деструктором. По сути, он устанавливает обработчик try / finally .

Другой метод, используемый gcc и Visual Studio для 64-битных вычислений, вызывает накладные расходы только в случае исключения ] брошенный (метод включает обход стека вызовов и поиск в таблице). В случаях, когда исключения возникают редко, это может фактически привести к более эффективному коду, поскольку коды ошибок не нужно обрабатывать.

46
ответ дан 7 November 2019 в 08:08
поделиться

Только блок try / catch и try / except требует выполнения нескольких инструкций по настройке. Накладные расходы, как правило, должны быть незначительными во всех случаях, кроме самых больших петель. Но обычно вы бы все равно не использовали try / catch /, кроме как во внутреннем цикле.

Я бы посоветовал не беспокоиться об этом и вместо этого использовать профилировщик для оптимизации вашего кода там, где это необходимо.

11
ответ дан 7 November 2019 в 08:08
поделиться

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

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

8
ответ дан 7 November 2019 в 08:08
поделиться

Там есть некоторые накладные расходы с исключениями (как указывали другие ответы).

Но в настоящее время у вас нет большого выбора. Попробуйте отключить исключения в своем проекте и убедитесь, что ВСЕ зависимый код и библиотеки могут компилироваться и работать без них.

Работают ли они с отключенными исключениями?

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

0
ответ дан 7 November 2019 в 08:08
поделиться

Только накладные расходы составляют ~ 6 инструкций, которые добавляют 2 SEH в начале функции и оставляют их в конце. Независимо от того, сколько попыток / ловушек у вас есть в потоке, это всегда одно и то же.

И что это за локальные переменные? Я слышу, как люди всегда жалуются на них при использовании try / catch. Я не понимаю, потому что деконструкторы все равно будут вызваны. Также вы не должны допускать, чтобы исключение увеличивалось более чем на 1-3 звонка.

-1
ответ дан 7 November 2019 в 08:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: