Найчастіше найкращим способом підвищення продуктивності є зміна алгоритму. Чим менш загальна реалізація, тим ближче ви можете підійти до металу.
Якщо припустити, що зроблено….
Якщо це дійсно критичний код, намагайтеся уникати читання пам'яті, намагайтеся уникати обчислення речей, які можна заздалегідь обчислити (хоча немає таблиць пошуку, оскільки вони порушують правило №1). Знайте, що робить ваш алгоритм, і запишіть його таким чином, що і компілятор це знає. Перевірте збірку, щоб переконатися, що це робить.
Уникайте пропусків кеша. Пакетна обробка стільки, скільки ви можете. Уникайте віртуальних функцій та інших непрямих.
Зрештою, виміряйте все. Правила постійно змінюються. Те, що раніше пришвидшувало код 3 роки тому, зараз уповільнює його. Гарний приклад - «використовувати подвійні математичні функції замість плаваючих версій». Я б не зрозумів цього, якби не прочитав.
Я забув - у конструкторів за замовчуванням не використовуються ваші змінні, або якщо ви наполягаєте, принаймні також створюйте конструктори, які цього не роблять. Будьте в курсі речей, які не відображаються в профілях. Коли ви втратите один непотрібний цикл на рядок коду, у вашому профілері нічого не з’явиться, але ви втратите загальну кількість циклів. Знову ж таки, знайте, що робить ваш код. Зробіть свою основну функцію худорлявою, а не надійною. Недорогі версії можна назвати за потреби, але вони не завжди потрібні. Універсальність приходить за ціною - продуктивність одна.
Відредаговано, щоб пояснити, чому немає ініціалізації за замовчуванням. Багато коду говорить: Vector3 bla; bla = DoSomething ();
Інтиалізація в конструкторі витрачається даремно. Крім того, у цьому випадку витрачений час невеликий (можливо, очищення вектора), однак якщо ваші програмісти роблять це звично, це додає. Крім того, багато функцій створюють тимчасовий (думаю, перевантажений оператори), який стає ініціалізованим до нуля і присвоюється відразу. Приховані втрачені цикли, які занадто малі, щоб побачити сплеск у вашому профіле, але цикли кровотоку по всій базі коду. Крім того, деякі люди роблять набагато більше в конструкторах (що, очевидно, ні-ні). Я бачив багатомілісекундні вигоди від невикористаної змінної, де конструктор виявився трохи важким. Як тільки конструктор спричинить побічні ефекти, компілятор не зможе його оптимізувати, тому, якщо ви ніколи не використовуєте наведений вище код, я віддаю перевагу або не ініціалізуючому конструктору, або, як я вже сказав,
Vector3 bla (noInit); bla = doSomething ();