Зазвичай я ненавиджу слово "передчасна оптимізація", але це нагадує його. Варто відзначити, що Кнут використовував цю відому цитату в контексті того, щоб натиснути на використання goto
висловлювань, щоб пришвидшити код у критичних областях. Ось і ключ: критичні шляхи.
Він пропонував використовувати goto
для прискорення коду, але попереджав тих програмістів, які хотіли б робити такі типи речей, що базуються на приманках та забобонах для коду, який навіть не є критичним.
switch
Максимально віддавати переваги заявам рівномірно на всій кодовій базі (незалежно від того, чи обробляється будь-яке велике навантаження) - класичний приклад того, що Кнут називає програмістом "копійчаним та дурним", який витрачає цілий день, намагаючись підтримувати свої "оптимізовані" "код, який перетворився на кошмар налагодження в результаті спроби зекономити копійки понад фунти. Такий код рідко є ретельним, не кажучи вже навіть про ефективний.
Він прав?
Він правильний з точки зору основної ефективності. Жоден компілятор, наскільки мені відомо, не може оптимізувати поліморфний код із залученням об'єктів та динамічної диспетчери краще, ніж оператор переключення. Ви ніколи не опинитесь LUT або перейдіть до таблиці з вбудованим кодом з поліморфного коду, оскільки такий код, як правило, служить бар'єром оптимізатора для компілятора (він не буде знати, яку функцію викликати до моменту, коли буде динамічна відправка трапляється).
Більш корисно не думати про цю вартість з точки зору таблиць стрибків, а більше з точки зору бар'єру оптимізації. Для поліморфізму виклик Base.method()
не дозволяє компілятору знати, яка функція насправді буде викликана, якщо method
вона віртуальна, не запечатана та може бути замінена. Оскільки він не знає, яку функцію насправді буде викликати заздалегідь, він не може оптимізувати виклик функції та використовувати більше інформації для прийняття оптимізаційних рішень, оскільки насправді не знає, яку функцію буде викликано на час складання коду.
Оптимізатори - це найкраще, коли вони можуть зазирнути до виклику функцій та здійснити оптимізацію, яка або повністю вирівняє абонента та абонента, або, принаймні, оптимізує абонента для найбільш ефективної роботи з викликом. Вони не можуть цього зробити, якщо не знають, яка функція насправді буде викликана заздалегідь.
Він просто розмовляє попкою?
Використання цієї вартості, яка часто становить копійки, для виправдання перетворення цього стандарту кодування, застосовуваного рівномірно, як правило, дуже нерозумно, особливо для місць, які потребують розширення. Це головне, на що потрібно стежити за допомогою справжніх передчасних оптимізаторів: вони хочуть перетворити незначні проблеми на продуктивність у стандарти кодування, що застосовуються рівномірно у всій кодовій базі, не враховуючи ремонтопридатності.
Я трохи ображаюся на цитату "старого хакера С", що використовується у прийнятій відповіді, оскільки я одна з таких. Не кожен, хто кодує десятиліттями, починаючи з дуже обмеженого обладнання, перетворився на передчасний оптимізатор. Але я теж стикався і працював з ними. Але ці типи ніколи не вимірюють такі помилки, як неправильне передбачення або кеш-пропуски, вони думають, що вони краще знають, і свої уявлення про неефективність базують на складному виробничому кодовому бази, заснованому на забобонах, які не відповідають дійсності сьогодні, а іноді і ніколи не відповідають дійсності. Люди, які справді працювали в найважливіших сферах продуктивності, часто розуміють, що ефективна оптимізація - це ефективна пріоритетність, і намагаються узагальнити стандарт кодування, що знижує рентабельність, щоб заощадити копійки, є дуже неефективним пріоритетним завданням.
Пенні важливі, коли у вас є дешева функція, яка не робить стільки роботи, яка називається мільярд разів у дуже тісному критичному циклі. У цьому випадку ми в кінцевому підсумку заощаджуємо 10 мільйонів доларів. Не варто голити копійки, коли у вас є функція, яка називається два рази, за яку організм один коштує тисячі доларів. Не розумно витрачати свій час, торгуючись за копійки під час придбання автомобіля. Варто торгуватися за копійки, якщо ви купуєте мільйон банок соди у виробника. Запорукою ефективної оптимізації є розуміння цих витрат у відповідному контексті. Хтось, хто намагається зекономити копійки на кожній покупці, і припускає, що всі інші намагаються торгуватися за копійки незалежно від того, що вони купують, не є кваліфікованим оптимізатором.