Сообщение Re[7]: Ширина кода - газетная vs книжная от 14.01.2025 10:29
Изменено 14.01.2025 19:14 serg_joker
Re[7]: Ширина кода - газетная vs книжная
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>А любой ли компилятор сумеет это свернуть в код без формирования функции и ее вызова?
Наверняка не любой, и не при любых настройках оптимизаци.
Мне ответ на этот вопрос неинтересен. А интересен ответ ответ на "будут ли компиляторы, которыми я пользуюсь для сборки релиза генерировать код не хуже, чем без IIL".
И да, мой ответ был бы скорее всего да (99%) для данного кода, но если важно, то нужно проверить.
"Любой компилятор" может в принципе не поддерживать C++11 и выше, mandatory RVO, разворот циклов и множество других вещей, влияющих на скорость выполнения. Смысла ориентироваться на "любой компилятор" не вижу никакого смысла.
Задачи написания максимально эффективного с точки зрения выполнения и максимально читабельного (что вообще субъективно) кода вообще конфликтуют зачастую.
А вот встречный вопрос:
предположим, что TypeWithLongName нетривиален и его копия/перемещение дороги.
А любой ли компилятор сможет в случае тернарного выражения выкинуть промежуточный временный объект-результат собственно тернарного выражения и сразу создавать VarWithLongName без копии/перемещения?
Хинт — нет, не любой и не с любыми настройками оптимизации (msvc /O0 точно не выкинет, возможно и с оптимизацией тоже) и тут стоимость копии может превысить расходы на вызов лямбды.
А версия с лямбдой — да, т.к. RVO.
Кроме того, у тебя там `?:`, т.е. бранч, стоимость миспредикшена которого может превысить стоимость вызова.
В случае с if, я могу добавить `[likely]]` и потенциально улучшить код, для тернарного оператора такой опции нет.
Короче, как всегда, написание оптимального кода без профилирования — дело неблагодарное.
Конкретно данный пример я бы написал с лямбдой, из-за RVO.
ЕМ>А любой ли компилятор сумеет это свернуть в код без формирования функции и ее вызова?
Наверняка не любой, и не при любых настройках оптимизаци.
Мне ответ на этот вопрос неинтересен. А интересен ответ ответ на "будут ли компиляторы, которыми я пользуюсь для сборки релиза генерировать код не хуже, чем без IIL".
И да, мой ответ был бы скорее всего да (99%) для данного кода, но если важно, то нужно проверить.
"Любой компилятор" может в принципе не поддерживать C++11 и выше, mandatory RVO, разворот циклов и множество других вещей, влияющих на скорость выполнения. Смысла ориентироваться на "любой компилятор" не вижу никакого смысла.
Задачи написания максимально эффективного с точки зрения выполнения и максимально читабельного (что вообще субъективно) кода вообще конфликтуют зачастую.
А вот встречный вопрос:
предположим, что TypeWithLongName нетривиален и его копия/перемещение дороги.
А любой ли компилятор сможет в случае тернарного выражения выкинуть промежуточный временный объект-результат собственно тернарного выражения и сразу создавать VarWithLongName без копии/перемещения?
Хинт — нет, не любой и не с любыми настройками оптимизации (msvc /O0 точно не выкинет, возможно и с оптимизацией тоже) и тут стоимость копии может превысить расходы на вызов лямбды.
А версия с лямбдой — да, т.к. RVO.
Кроме того, у тебя там `?:`, т.е. бранч, стоимость миспредикшена которого может превысить стоимость вызова.
В случае с if, я могу добавить `[likely]]` и потенциально улучшить код, для тернарного оператора такой опции нет.
Короче, как всегда, написание оптимального кода без профилирования — дело неблагодарное.
Конкретно данный пример я бы написал с лямбдой, из-за RVO.
Re[7]: Ширина кода - газетная vs книжная
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>А любой ли компилятор сумеет это свернуть в код без формирования функции и ее вызова?
Наверняка не любой, и не при любых настройках оптимизаци.
Мне ответ на этот вопрос неинтересен. А интересен ответ ответ на "будут ли компиляторы, которыми я пользуюсь для сборки релиза генерировать код не хуже, чем без IIL".
И да, мой ответ был бы скорее всего да (99%) для данного кода, но если важно, то нужно проверить.
"Любой компилятор" может в принципе не поддерживать C++11 и выше, mandatory RVO, разворот циклов и множество других вещей, влияющих на скорость выполнения. Ориентироваться на "любой компилятор" не вижу никакого смысла.
Задачи написания максимально эффективного с точки зрения выполнения и максимально читабельного (что вообще субъективно) кода вообще конфликтуют зачастую.
А вот встречный вопрос:
предположим, что TypeWithLongName нетривиален и его копия/перемещение дороги.
А любой ли компилятор сможет в случае тернарного выражения выкинуть промежуточный временный объект-результат собственно тернарного выражения и сразу создавать VarWithLongName без копии/перемещения?
Хинт — нет, не любой и не с любыми настройками оптимизации (msvc /O0 точно не выкинет, возможно и с оптимизацией тоже) и тут стоимость копии может превысить расходы на вызов лямбды.
А версия с лямбдой — да, т.к. RVO.
Кроме того, у тебя там `?:`, т.е. бранч, стоимость миспредикшена которого может превысить стоимость вызова.
В случае с if, я могу добавить `[likely]]` и потенциально улучшить код, для тернарного оператора такой опции нет.
Короче, как всегда, написание оптимального кода без профилирования — дело неблагодарное.
Конкретно данный пример я бы написал с лямбдой, из-за RVO.
ЕМ>А любой ли компилятор сумеет это свернуть в код без формирования функции и ее вызова?
Наверняка не любой, и не при любых настройках оптимизаци.
Мне ответ на этот вопрос неинтересен. А интересен ответ ответ на "будут ли компиляторы, которыми я пользуюсь для сборки релиза генерировать код не хуже, чем без IIL".
И да, мой ответ был бы скорее всего да (99%) для данного кода, но если важно, то нужно проверить.
"Любой компилятор" может в принципе не поддерживать C++11 и выше, mandatory RVO, разворот циклов и множество других вещей, влияющих на скорость выполнения. Ориентироваться на "любой компилятор" не вижу никакого смысла.
Задачи написания максимально эффективного с точки зрения выполнения и максимально читабельного (что вообще субъективно) кода вообще конфликтуют зачастую.
А вот встречный вопрос:
предположим, что TypeWithLongName нетривиален и его копия/перемещение дороги.
А любой ли компилятор сможет в случае тернарного выражения выкинуть промежуточный временный объект-результат собственно тернарного выражения и сразу создавать VarWithLongName без копии/перемещения?
Хинт — нет, не любой и не с любыми настройками оптимизации (msvc /O0 точно не выкинет, возможно и с оптимизацией тоже) и тут стоимость копии может превысить расходы на вызов лямбды.
А версия с лямбдой — да, т.к. RVO.
Кроме того, у тебя там `?:`, т.е. бранч, стоимость миспредикшена которого может превысить стоимость вызова.
В случае с if, я могу добавить `[likely]]` и потенциально улучшить код, для тернарного оператора такой опции нет.
Короче, как всегда, написание оптимального кода без профилирования — дело неблагодарное.
Конкретно данный пример я бы написал с лямбдой, из-за RVO.