Затраты на обработку исключений в D - PullRequest
11 голосов
/ 28 августа 2010

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

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

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

Конечно, все это, вероятно, определяется реализацией, поэтому для этого вопроса, пожалуйста, обратите внимание на компилятор DMD.

Ответы [ 2 ]

27 голосов
/ 28 августа 2010

Я не могу говорить о D или любом из его компиляторов, но я могу рассказать вам немного о C ++, Windows и компиляторе Visual Studio.Это может помочь вам приблизительно понять, как работает D.

Во-первых, обработка исключений на 32- и 64-разрядных компьютерах отличается.ABI x86 (пролог / эпилог, разматывание, соглашение о вызовах) более слаб, поэтому компилятор и сама программа должны выполнять больше работы.ABI x86-64 более строгий, и операционная система играет большую роль, облегчая работу самой программы с исключениями.Если вы используете D в Windows, то он, вероятно, использует SEH (структурированная обработка исключений), как в C ++.

Опять же, все мои ответы ниже относятся к Windows, C ++ и VisualStudio.

Что если я не напишу код обработки исключений?

x86 / x86-64: этот метод не оплачивается.

Что делать, если я делаю, но исключения никогда не генерируются?

x86: Существует плата, даже если исключения не выбрасываются.Информация об обработке исключений помещается в TIB (блок с информацией о потоках), такой как начальная область и обработчик исключений для конкретной функции.Чтобы узнать, какие объекты нужно разрушить и какие обработчики искать, поддерживается переменная области видимости.Эта переменная области действия обновляется при вводе блоков try и создании объектов стека с деструкторами.

x86-64: из-за более строгих правил нет дополнительного кода (или очень очень минимального).Это большое преимущество перед x86.

Что, если я это сделаю, и будет выдано исключение?

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

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


Общая картина:

  • Я могу 'Я не вижу, чтобы распространение кодов ошибок было значительно быстрее обработки исключений, особенно на платформах x64.
  • Я сомневаюсь, что вы когда-либо столкнетесь с проблемой обработки исключений, если только вы не злоупотребляете исключениями.Вы не уверены, вы должны измерить производительность вашего кода.
6 голосов
/ 28 августа 2010

Насколько я знаю, DMD использует какой-либо нативный механизм на платформе.В Windows это будет Структурная обработка исключений, которая также используется MSVC ++ для реализации исключений.

В Linux, я полагаю, он использует тот же механизм таблиц исключений, что и GCC.На других платформах я не знаю.

С точки зрения производительности, это, вероятно, то же самое (или, по крайней мере, очень близко) к C ++.

...