Все попытки эффективного кода, написанного на чем угодно, кроме ассемблера, очень и очень сильно зависят от оптимизации компилятора, начиная с самого простого, такого как эффективное распределение регистров, чтобы избежать лишних разливов стека повсюду и, по крайней мере, достаточно хорошего, если не отличного, выбора команд. В противном случае мы вернулись бы в 80-е годы, когда нам приходилось ставить register
подсказки повсеместно и использовать минимальное количество переменных в функции, чтобы помочь архаичным компиляторам Си или даже раньше, когда goto
была полезна оптимизация ветвления.
Если бы мы не чувствовали, что можем полагаться на способность нашего оптимизатора оптимизировать наш код, мы все равно будем кодировать критичные к производительности пути выполнения в сборке.
Это действительно вопрос того, насколько надежно вы чувствуете, что можно провести оптимизацию, которую лучше всего разобрать, профилировав и изучив возможности имеющихся у вас компиляторов и, возможно, даже разобрав их, если есть горячая точка, которую вы не можете понять, где, по-видимому, компилятор не смогли сделать очевидную оптимизацию.
RVO - это то, что существует уже много лет, и, по крайней мере, за исключением очень сложных случаев, это то, что компиляторы надежно применяют на протяжении веков. Определенно не стоит обходить проблему, которой не существует.
Ошибка на стороне полагаться на оптимизатор, не опасаясь его
Напротив, я бы сказал, что ошибочно полагается на то, что слишком много полагается на оптимизацию компилятора, чем на слишком маленькое, и это предложение исходит от парня, который работает в областях, критически важных для производительности, где эффективность, ремонтопригодность и воспринимаемое качество среди клиентов все одно гигантское пятно. Я бы предпочел, чтобы вы слишком уверенно полагались на свой оптимизатор и находили некоторые непонятные крайние случаи, когда вы полагались слишком сильно, чем полагались слишком мало, и просто утаивали все время от суеверных страхов всю оставшуюся жизнь. Это, по крайней мере, заставит вас обратиться к профилировщику и должным образом расследовать, если что-то не выполняется так быстро, как должно, и получать ценные знания, а не суеверия.
У тебя хорошо получается положиться на оптимизатор. Так держать. Не становитесь похожим на того парня, который начинает явно просить встроить каждую функцию, вызванную в цикле, прежде чем даже профилировать из-за ошибочного страха перед недостатками оптимизатора.
профилирование
Профилирование действительно является окольным, но окончательным ответом на ваш вопрос. Новички, жаждущие написать эффективный код, с которым часто приходится бороться, не то, что нужно оптимизировать, а то, что не нужно оптимизировать, потому что они разрабатывают всевозможные ложные догадки о неэффективности, которые, хотя и интуитивно понятны, ошибочны в вычислительном отношении. Опыт работы с профилировщиком действительно даст вам правильную оценку не только возможностей оптимизации ваших компиляторов, на которые вы можете уверенно опираться, но и возможностей (а также ограничений) вашего оборудования. Возможно, в профилировании даже больше смысла изучать то, что не стоит оптимизировать, чем изучать то, что было.