Не парьтесь, пишите как понятней вам. Нормальный оптимизатор изменит код до неузнаваемости.
Для проверки могу порекомендовать поэкспериментировать на gcc (mingw на Windows). В командной строке:
gсс source.cpp -o out.txt -S неоптимизированный код gсс source.cpp -o out.txt -S -O3 оптимизированный код
Получится ассемблерный код после оптимизации/без оптимизации.
mingw http://sourceforge.net/projects/mingw/files/latest/download?source=files
Не парьтесь, пишите как понятней вам. Нормальный оптимизатор изменит код до неузнаваемости.
Для проверки могу порекомендовать поэкспериментировать на gcc (mingw на Windows). В командной строке:
Получится ассемблерный код после оптимизации/без оптимизации.
mingw http://sourceforge.net/projects/mingw/files/latest/download?source=files
К сожалению, я очень далек от программирования и ассемблерный код не понимаю. Поэтому готов верить мнению профессионалов.
Можно ли утвреждать, что при оптимизации в Calculate1 будет заинлайнен GetNums таким образом, что if внутри него выполнится только один раз?
Вечная дилема между красивым/лаконичным кодом и быстродействующим у каждого решается по-своему. Очень часто многое отдается на откуп компилятору с надеждой, что лаконичный код будет компилятором прооптимизирован (через инлайнинг и прочее) до состояния быстродействующего варианта.
Такие ситуации встречаются довольно часто. Вот пример довольно распространенного случая:
Пояснения и вопросы в комментариях. Кракто, как в такой ситуации добиться быстродействия и не потерять в стройности кода? Пришло на ум использование макросов.
В общем, поделититесь своим опытом и рекомендациями, как действовать, когда, например, всего лишь из-за одного if (как в примере) приходится для быстродействия копи-пастить огромную часть кода, создавая монстрский код.
Очевидно, подобных ситуаций можно придумать множество. Какие общие могут быть рекомендации? Дайте ссылки на обсуждения этой поросшей мхом проблемы.
Если быстродействие критично, забейте на лаконичность.
Если нет, то делайте как больше нравится. Не нужно оптимизировать то, что итак работает достаточно быстро.
К сожалению, я очень далек от программирования и ассемблерный код не понимаю. Поэтому готов верить мнению профессионалов.
Можно ли утвреждать, что при оптимизации в Calculate1 будет заинлайнен GetNums таким образом, что if внутри него выполнится только один раз?
Я не могу говорить за MQ компилятор, c gcc получилось следующее:
_Calculate1: ... cmpb $0, 32(%esp) # если FlagSource != 0, jne L13 # то уходим на L13. ... L12: # FlagSource == 0. movl _Source2+4(,%ebx,8), %eax # читаем Num1 ... # и movl _Source2(,%ebx,8), %eax # Num2. ... cmpl $1000000, %ebx jne L12 # если i не 1000000, то прыгаем на L12. L9: ... ret # выходим из функции. ... L13: # FlagSource == 1. ... movl _Source1+4(,%ebx,8), %eax # читаем Num1 ... # и movl _Source1(,%ebx,8), %eax # Num2. ... cmpl $1000000, %ebx jne L13 # если i не 1000000, то прыгаем на L13. jmp L9 # прыгаем на выход.
GetNums() заинлайнилась.
Вы перезагоняетесь. Конечно 1 вариант.
Если быстродействие критично, забейте на лаконичность.
Если нет, то делайте как больше нравится. Не нужно оптимизировать то, что итак работает достаточно быстро.
Конечно, здесь ресь не идет о критичности скорости выполнения - иначе выбирать не приходилось бы.
Внутри сидит какой-то глист-эстет (с раздвоением личности), который удовлетворен бывает только тогда, когда лаконичность и быстродействие находятся в разумном консенсусе.
В общем, если мне скажут что это имеет место быть:
... при оптимизации в Calculate1 будет заинлайнен GetNums таким образом, что if внутри него выполнится только один раз
Я не могу говорить за MQ компилятор, c gcc получилось следующее:
GetNums() заинлайнилась.
Заинлайнилась - это хорошо! Не понял только, if выполнится один раз или с каждом шагом в цикле for?
ЗЫ Заинлайнилась - моща у русского языка еще та! И ведь все понимают. И по филологическим правилам. Pavlick, красава!
После оптимизации Calculate1() == Calculate2()
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вечная дилема между красивым/лаконичным кодом и быстродействующим у каждого решается по-своему. Очень часто многое отдается на откуп компилятору с надеждой, что лаконичный код будет компилятором прооптимизирован (через инлайнинг и прочее) до состояния быстродействующего варианта.
Такие ситуации встречаются довольно часто. Вот пример довольно распространенного случая:
Пояснения и вопросы в комментариях. Кракто, как в такой ситуации добиться быстродействия и не потерять в стройности кода? Пришло на ум использование макросов.
В общем, поделититесь своим опытом и рекомендациями, как действовать, когда, например, всего лишь из-за одного if (как в примере) приходится для быстродействия копи-пастить огромную часть кода, создавая монстрский код.
Очевидно, подобных ситуаций можно придумать множество. Какие общие могут быть рекомендации? Дайте ссылки на обсуждения этой поросшей мхом проблемы.