![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Тема об производительных издержках исключений поднималась уже не раз, и почти все заканчивались выводом о том, что если использовать исключения только для обработки ошибок (не в стандартном пути выполнения), то издержки малы. Но всё же не хватает конкретики.
1. Сколько? Сколько дополнительного кода выполняется при стандартном выполнении программы. 2. Саттер пишет: при использовании спецификаций исключений генерируется дополнительный код для проверки проходящих исключений + в случае прохода не специфичного исключения программа аварийно завершается - вывод (его) не использовать спецификации исключений вовсе. С другой стороны есть утверждение что использование пустых спецификаций исключений (для функций не генерирующих исключений) позволяет компилятору оптимизацию заключающуюся в том, что в функциях, где не может быть прохождения исключения не вставлять дополнительные заголовки и т.д. 3. Вопрос вытекающий из предыдущего: может ли цепочка вызовов функций, нигде не использующих исключения, быть полностью освобождена от кода поддержки исключений. 4. Развейте или подтвердите: функция содержащая генерацию исключения или блок обработки не может быть встроена. |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
http://www.sco.com/developers/products/ehopt.pdf
Это сообщение отредактировал(а) J0ker - 20.9.2008, 18:27 |
|||
|
||||
| georain |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Ну как я понял из статьи при использовании технологии обработки исключений с использованием таблиц с оптимизацией:
Меньше 5%.
Тут не понятно. Вроде как спецификации должны давать оптимизацию, но компиляторы эту возможность плохо поддерживают. + Что-то я так и не понял, спецификации в основную линию вносят дополнительный код или нет?
Может, но делаю ли это реальные компиляторы?
Functions with EH(Exception Handling) tables cannot easily be inlined, due to the tables’ contents being determined in the compiler before the decision to inline is made. Т.е. по идее может. Это сообщение отредактировал(а) georain - 21.9.2008, 22:01 |
||||||||
|
|||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Все зависит от компилятора.
Например, компилятор от Borland не умеет встраивать функции содержащие циклы... |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Нет. Именно циклы. У него даже warning на это дело выдается. Добавлено через 22 секунды во всяком случае в bcc551 warning есть. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| nickless |
|
||||||||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
gcc например не генерирует код для обработки исключений для функций не бросающих исключения, т.е. вроде
Из интереса провёл маленький тест, класс:
main
код (без оптимизации) вызов fun1:
вызов fun2
вызовы fun3-5
с оптимизацией это всё инлайнится -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||||||||
|
|||||||||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
в gcc,спецификация исключенний это тоже просто комменты? |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Не понял, почему "тоже"? Добавлено через 1 минуту и 16 секунд ЗЫ Кстати в самой функции исключение генерируется не смотря на throw(), но при вызове не ловится. -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
в vs спецификации исключений работают нестандартно, throw работает как надо, а непустая спеификация - все равно что ее отсутствие, почти как комментарий
|
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
nickless, спасибо.
Это сообщение отредактировал(а) georain - 25.9.2008, 20:34 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
в M$ ловятся в любом случае
разница - не разрушаются локальные объекты, т.к. функция объявленная throw() не добавляется в таблицу размотки |
|||
|
||||
| nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
А, ясно, да g++ похоже использует спецификацию throw по назначению (судя по тестам). Кстати версия GCC если что
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
nickless, а можете проверить как работает throw() если не сама эта функция вызвала throw, а та, которую она вызывает?
по идее все до нее должны размотаться, а она сама должна вызвать terminate() меня интересует конкретно вопрос размотки |
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
А куда в ассемблере в fun3 делся блок проверки условия и генерации исключения?
А это вызовы, сорри Это сообщение отредактировал(а) georain - 25.9.2008, 20:40 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |