Какова стоимость использования исключений в Objective-C? - PullRequest
9 голосов
/ 10 сентября 2010

Я имею в виду в текущей реализации clang или версии gcc.

Ребята из C ++ и Java всегда говорят мне, что исключения не будут стоить никакой производительности, если их не выбросить.То же самое верно для Objective-C?

Ответы [ 2 ]

9 голосов
/ 31 октября 2012

Ребята из C ++ и Java всегда говорят мне, что исключения не будут стоить никакой производительности, если их не выбросить. То же самое верно для Objective-C?

Короткий ответ

Только в 64-битной OS X и iOS.

Они не совсем бесплатны. Чтобы быть более точным, модель оптимизирована для минимизации затрат при регулярном выполнении (перемещение последствий в другом месте).

Подробный ответ

В 32-битных OS X и iOS исключения имеют стоимость времени выполнения, даже если они не выбрасываются. Эти архитектуры не используют исключения нулевой стоимости.

В 64-битной OS X ObjC перешел к заимствованиям C ++ «Исключения нулевой стоимости». Исключения с нулевой стоимостью имеют очень очень низкие накладные расходы на выполнение, , если не выдано . Исключения нулевой стоимости эффективно переводят стоимость выполнения в двоичный размер. Это было одной из основных причин, почему они изначально не использовались в iOS. Включение исключений C ++ и RTTI может увеличить размер двоичного файла более чем на 50% - конечно, я ожидал бы, что эти числа будут намного ниже в чистом ObjC просто потому, что при размотке будет меньше выполнения.

В arm64 модель исключения была изменена с Set Jump Long Jump на Исключения нулевой стоимости, полученные из Itanium (судя по сборке).

Однако Идиоматические программы ObjC не написаны и не готовы к восстановлению после исключений , поэтому вы должны зарезервировать их для ситуаций, из которых вы не собираетесь восстанавливаться (если вы решите их использовать вообще) , Более подробная информация содержится в руководстве Clang для ARC и в других разделах указанной страницы.

6 голосов
/ 10 сентября 2010

Согласно некоторым примечаниям к выпуску за 2007 год для среды выполнения Objective C в Mac OS X v10.5, они переписали 64-битную реализацию исключений Objective C для обеспечения «нулевых» пробных блоков и взаимодействия с C ++.

По-видимому, эти блоки попыток с нулевой стоимостью не несут никакой временной потери при вводе попытки, в отличие от 32-битного аналога, который должен вызывать setjmp () и другие функции. Видимо, бросать их «намного дороже».

Это единственная информация, которую я могу найти в примечаниях к выпуску Apple, поэтому я должен предположить, что это все еще применяется в сегодняшних средах исполнения, и, как таковые, 32-битные исключения = дорого, 64-битные исключения = "нулевая стоимость"

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