Усі спроби ефективного коду, написаного в чому завгодно, крім складання, дуже і дуже покладаються на оптимізацію компілятора, починаючи з найпростішого, наприклад ефективного розподілу реєстру, щоб уникнути зайвих розсипань стека в усьому місці і, принаймні, досить хорошого, якщо не відмінного, вибору інструкцій. Інакше ми повернемося до 80-х років, де нам довелося розміщувати register
підказки всюди і використовувати мінімальну кількість змінних у функції, щоб допомогти архаїчним компіляторам C або навіть раніше, коли goto
була корисною оптимізацією розгалуження.
Якщо б нам не здалося, що ми можемо розраховувати на здатність нашого оптимізатора оптимізувати наш код, ми все-таки кодуємо критичні для продуктивності шляхи виконання в зборі.
Це справді питання про те, наскільки надійно ви відчуваєте, що оптимізація може бути зроблена, що найкраще розібратися за допомогою профілювання та вивчення можливостей компіляторів, які у вас є, і, можливо, навіть розбирання, якщо є точка доступу, ви не можете зрозуміти, де здається компілятор не вдалося зробити очевидну оптимізацію.
RVO - це те, що існує протягом багатьох століть, і, принаймні, виключаючи дуже складні випадки, - це те, що компілятори надійно застосовують протягом століть. Однозначно не варто працювати над проблемою, яка не існує.
Помилка на стороні того, що покладатися на оптимізатор, не боячись цього
Навпаки, я б сказав, що помиляється на тому, що занадто багато покладатися на оптимізацію компілятора, ніж занадто мало, і ця пропозиція походить від хлопця, який працює в дуже критичних для продуктивності сферах, де ефективність, ремонтопридатність та сприйнята якість серед клієнтів є все одне гігантське розмиття. Я вважаю за краще, щоб ви занадто впевнено покладалися на свого оптимізатора і знаходили деякі незрозумілі випадки, коли ви покладалися занадто багато, ніж покладаєтесь занадто мало і просто кодували забобонні страхи весь час свого життя. Принаймні, ви будете шукати профайлера і правильно досліджувати, якщо речі не виконуються так швидко, як слід, і на шляху ви здобуваєте цінні знання, а не забобони.
Ви добре впираєтесь в оптимізатор. Так тримати. Не ставте таким, як хлопець, який починає явно просити вбудувати кожну функцію, викликану в циклі, перш ніж навіть профайлювати з помилкового страху перед недоліками оптимізатора.
Профілювання
Профілювання - це справді кругла, але остаточна відповідь на ваше запитання. Новачки, які прагнуть написати ефективний код, часто борються не з тим, що оптимізувати, це з тим, що не оптимізувати, оскільки вони розробляють всілякі помилкові помилки щодо неефективності, які, хоча людино інтуїтивно зрозумілі, обчислювально помиляються. Розробка досвіду роботи з профілером почне справді давати вам належну оцінку не тільки можливостям оптимізації ваших компіляторів, на які ви можете впевнено спиратися, але й можливостям (а також обмеженням) вашого обладнання. Можливо, ще більше значення має профілювання у вивченні того, чого не варто оптимізувати, ніж вивчати те, що було.