Comments 38
> То есть: просто включение поддержки исключений привело и к увеличению объёма конечного бинарного файла
Существенная деталь: в вашем трансляторе (суть которого — костыль для процессоров, разработчики которых не любят своих пользователей). В большинстве современных трансляторов используются zero-cost exceptions.
Проблема с исключениями для embedded и real-time в том, что очень сложно реализовать throw так, чтобы для вызова соответствующего catch была оценка времени сверху.
Существенная деталь: в вашем трансляторе (суть которого — костыль для процессоров, разработчики которых не любят своих пользователей). В большинстве современных трансляторов используются zero-cost exceptions.
Проблема с исключениями для embedded и real-time в том, что очень сложно реализовать throw так, чтобы для вызова соответствующего catch была оценка времени сверху.
+11
>zero-cost exceptions.
А можно показать это на псевдо-коде? Очень же интересно.
>костыль для процессоров, разработчики которых не любят своих пользователей
Я бы не стал заносить Intel и TI в эту категорию.
А можно показать это на псевдо-коде? Очень же интересно.
>костыль для процессоров, разработчики которых не любят своих пользователей
Я бы не стал заносить Intel и TI в эту категорию.
+3
> А можно показать это на псевдо-коде? Очень же интересно.
На основе таблиц. Погуглите, до меня хорошо расписано в сотнях источников.
> Я бы не стал заносить Intel и TI в эту категорию.
Qualcomm для Hexagon пилят backend (open source!) для llvm. Автоматически получают все самые свежие возможности C++. Они любят своих пользователей.
На основе таблиц. Погуглите, до меня хорошо расписано в сотнях источников.
> Я бы не стал заносить Intel и TI в эту категорию.
Qualcomm для Hexagon пилят backend (open source!) для llvm. Автоматически получают все самые свежие возможности C++. Они любят своих пользователей.
+3
>>На основе таблиц. Погуглите, до меня хорошо расписано в сотнях источников.
Гуглится, к примеру это: llvm.org/docs/ExceptionHandling.html. Но все же лучше пример псевдокода
Гуглится, к примеру это: llvm.org/docs/ExceptionHandling.html. Но все же лучше пример псевдокода
0
Вот это ещё хорошо: llvm.org/demo/index.cgi
Можно скармливать куски кода и смотреть во что он их компилирует.
Можно скармливать куски кода и смотреть во что он их компилирует.
+1
Прикол в том, что некоторые вещи сложно показать на псевдокоде. Вообще, это странная постановка вопроса: компилятор преобразует код С++ в байты, грубо говоря ассемблер. При этом непонятно, при чем тут С? Не каждый код может быть легко и непринужденно лечь на код С. Это иллюзия, что С++ со своими конструкциями сводится к С.
Я ожидал в статье увидеть разбор того, как генерируются исключения на современенных компляторах и платформах, когда происходит zero overhead, генерируются таблицы и по ним и колстеку происходит раскрутка. Например, компилятор msvc x64 добавляет nop операции и использует это при генерации исключений. Ничего подобного, что описано в этой статье, к данному случаю не имеет. Таким образом статья получилась как сферический конь в вакууме. Автору стоит внимательней изучить матчасть современных компиляторов.
Я ожидал в статье увидеть разбор того, как генерируются исключения на современенных компляторах и платформах, когда происходит zero overhead, генерируются таблицы и по ним и колстеку происходит раскрутка. Например, компилятор msvc x64 добавляет nop операции и использует это при генерации исключений. Ничего подобного, что описано в этой статье, к данному случаю не имеет. Таким образом статья получилась как сферический конь в вакууме. Автору стоит внимательней изучить матчасть современных компиляторов.
+6
Жаль, что статья показалась общей. Она больше относится к ситуации в своей узкой сфере.
0
Ну я бы не сказал, что она была общей. Она была вообще про другое: как старый преобразователь поганит код C++ при переходе к C. Ничего общего к проблеме исключений это не имеет. И взяв этот преобразователь говорить о нечто общем — это несколько странно. Тут скорее взят некий очень частный случай, не имеющий с реальной жизнью ничего общего.
+2
«При этом непонятно, при чем тут С? Не каждый код может быть легко и непринужденно лечь на код С. Это иллюзия, что С++ со своими конструкциями сводится к С.»
Это распространенная практика — использовать Си в качестве portable-асемблера в разного рода трансляторах. В Си можно транслировать даже Scheme, со всеми приколами вроде обязательной оптимизации хвостовой рекурсии и call-cc.
Это распространенная практика — использовать Си в качестве portable-асемблера в разного рода трансляторах. В Си можно транслировать даже Scheme, со всеми приколами вроде обязательной оптимизации хвостовой рекурсии и call-cc.
-1
Речь не про то, что можно или нельзя. Конечно можно. Вопрос в том, стоит ли на основании этой трансляции делать выводы о производительности. На мой взгляд ответ — нет. Более того, это даже неправильно, т.к. на производительность могут влиять многие достаточно тонкие эффекты и вещи.
+1
Была статья по Java:
habrahabr.ru/blogs/java/133452/
в которой выявлен «порог»: если исключения выбрасываются реже 1:1000, то оверхеда по производительности нет.
Вопрос — что лучше: компенсировать оверхед исключений апгрейдом железа, или усложнить разработку неиспользованием исключений.
habrahabr.ru/blogs/java/133452/
в которой выявлен «порог»: если исключения выбрасываются реже 1:1000, то оверхеда по производительности нет.
Вопрос — что лучше: компенсировать оверхед исключений апгрейдом железа, или усложнить разработку неиспользованием исключений.
0
Для не embedded систем всё намного лучше. В случае, когда исключение не выбрасывается, код на исключениях оказался быстрее кода на return values (правда совсем чуть-чуть быстрее). Выбрасывание исключения, само собой, вещь жутко медленная, но мы же их выбрасываем только в исключительных случаях, правда?
+2
Полезные данные, плохая статья. Нет ответа на самый главный вопрос — почему?! Я вообще был бы очень рад узнать, почему выходит быстрее.
0
Нет оверхеда на проверку возвращаемого результата.
+2
Я правильно понимаю, что в таком случае исключение — банально longjump?
0
setjump/longjump (SJLJ) — это медленный способ реализации исключений.
В zero-cost способе в случае исключения у нас будет поиск нужного обработчика по таблицам и это может быть не быстро. Но для установки обработчика не нужно производить сложных действий. Поэтому если исключения нет — то мы за обработчики не платим.
В zero-cost способе в случае исключения у нас будет поиск нужного обработчика по таблицам и это может быть не быстро. Но для установки обработчика не нужно производить сложных действий. Поэтому если исключения нет — то мы за обработчики не платим.
+2
Там же длиннющее обсуждение к этой статье прилагается
0
Я порылся в гуглах и уже нашел исчерпывающее обьяснение с асм-кодом и девушками. Вот, если кто еще интересуется: lazarenko.me/tips-and-tricks/c-exception-handling-and-performance
+4
UFO just landed and posted this here
Хочется заметить о неиспользовании исключений в Google и LLVM:
http://llvm.org/docs/CodingStandards.html#ci_rtti_exceptions
Мотивы первого — совместимость с существующим кодом без исключений. Мотивы второго — размер кода и философия.
http://llvm.org/docs/CodingStandards.html#ci_rtti_exceptions
Мотивы первого — совместимость с существующим кодом без исключений. Мотивы второго — размер кода и философия.
0
Хотелось бы понять, как переход от C++ к C связан с быстродействием генерируемого кода с использованием современных компиляторов? Большинство компиляторов просто заменяют виртуальный вызов на невиртуальный, т.к. инстанс известен во время компиляции.
+1
Интересно, какие это компиляторы так делают. Я бы не хотел, чтобы вызов был невиртуальным, т.к. весь смысл виртуальных функций пропадает. И если тип переменной struct AAAAA*, то это не значит, что надо вызывать AAAAA::process(). Переменная может указывать на struct BBBBB*.
-3
Это все отлично в теории, но меня всегда радовали люди, которые о производительности рассуждают на уровне «ну вот здесь будет замедление». Во сколько раз? В каких ситуациях? В каком соотношении нормальное исполнение — брошенное исключение?
Я не говорю, что Вы неправы. Просто то, что написано в статье должно идти последней главой под названием «Разберемся, почему так» в большом 5-ти главном исследовании.
Поймите, что производительность — это чистая наука. Сделал — померил, еще сделал — еще померил, сравнил, выбрал.
Я не говорю, что Вы неправы. Просто то, что написано в статье должно идти последней главой под названием «Разберемся, почему так» в большом 5-ти главном исследовании.
Поймите, что производительность — это чистая наука. Сделал — померил, еще сделал — еще померил, сравнил, выбрал.
+1
Автор же написал — речь идёт о встраиваемых системах. Т.е. всякого рода контроллеров. Там узкие места нужно заранее в уме держать, чтобы через месяц разработки не оказалось, что система просто не успевает. И измерить производительность там тоже нетривиальное дело. Работа идёт больше частью с железом и система получается недетерминированной. Измерять, как привило, приходится косвенными методами.
0
Речь идёт не о встраиваемой с системе, а о костыльном трансляторе и этим всё сказано.
+2
Речь идёт именно встраиваемых системах. Для десктопа это всё вообще слабо-акутально и сплошная переоптимизация. И нужно быть специфичным человеком, чтобы применять на десктопе подобные инструменты.
А для встраиваемых систем вполне нормально. Архитектор много и писать полноценный набор компиляторов долго и сложно. Часто производители пишут/заказывают компилятор C и к нему вот такие костыли.
А для встраиваемых систем вполне нормально. Архитектор много и писать полноценный набор компиляторов долго и сложно. Часто производители пишут/заказывают компилятор C и к нему вот такие костыли.
0
Как-то погрустнело от кода с исключениями. И это код, не делающий ничего полезного. Если бы я писал под МК на С++, то мой проект, переделанный на С с исключениями, занял бы 2 MБайта и влезал бы наверное в притирку.
P.S. Напишите исходный размер, а то непонятно во сколько раз увеличение происходит.
P.S. Напишите исходный размер, а то непонятно во сколько раз увеличение происходит.
-2
Прошу выделить итоговые выводы подзаголовком «Вывод»
0
Sign up to leave a comment.
Exceptions и производительность