Я часто бачив, що ця цитата використовується для виправдання очевидно поганого коду чи коду, які, хоча його ефективність не була виміряна, можна було б зробити швидше досить легко, не збільшуючи розмір коду чи не загрожуючи його читабельності.
Взагалі, я думаю, що рання мікрооптимізація може бути поганою ідеєю. Однак макрооптимізація (такі, як вибір алгоритму O (log N) замість O (N ^ 2)) часто варта і повинна бути здійснена рано, оскільки може бути марно писати алгоритм O (N ^ 2) і потім повністю відкиньте його на користь підходу O (log N).
Зауважте, такі слова можуть бути : якщо алгоритм O (N ^ 2) простий і легкий для запису, його можна викинути пізніше без особливої провини, якщо він виявиться занадто повільним. Але якщо обидва алгоритми однаково складні, або якщо очікувана завантаженість настільки велика, що ви вже знаєте, що вам знадобиться більш швидкий, то оптимізація на ранніх стадіях є надійним інженерним рішенням, яке в майбутньому скоротить ваше загальне навантаження.
Таким чином, загалом, я думаю, що правильний підхід полягає в тому, щоб з’ясувати, які є ваші варіанти, перш ніж почати писати код, і свідомо вибрати найкращий алгоритм для вашої ситуації. Найголовніше, що фраза «передчасна оптимізація - корінь усього зла» - це не привід для незнання. Професійні розробники повинні мати загальне уявлення про те, скільки коштують загальні операції; вони повинні знати, наприклад,
- що струни коштують дорожче, ніж числа
- що динамічні мови набагато повільніші, ніж мови з статичним типом
- переваги списку масивів / векторів над пов'язаними списками, і навпаки
- коли користуватися хештелем, коли використовувати відсортовану карту та коли купувати
- що (якщо вони працюють з мобільними пристроями) "подвійний" та "інт" мають схожі показники роботи на робочих столах (FP може бути навіть швидшим), але "подвійний" може бути в сто разів повільніше на мобільних пристроях низького класу без FPU;
- що передача даних через Інтернет відбувається повільніше, ніж доступ до жорсткого диска, жорсткі диски значно повільніші за оперативну пам’ять, оперативна пам’ять набагато повільніше, ніж кеш-пам'ять L1 та регістри, а операції в Інтернеті можуть блокуватися на невизначений час (і виходити з ладу в будь-який час).
І розробники повинні бути знайомі з набором інструментів структур даних та алгоритмів, щоб вони могли легко використовувати потрібні інструменти для роботи.
Маючи багато знань та особистий набір інструментів, ви можете оптимізувати майже без особливих зусиль. Докладати багато зусиль для оптимізації, яка може бути непотрібною - це зло (і я визнаю, що потрапляв у цю пастку не раз). Але коли оптимізація настільки проста, як вибір набору / хештелів замість масиву або збереження списку чисел у подвійному [] замість рядка [], то чому б ні? Я, можливо, не погоджуюся з Knuth тут, я не впевнений, але я думаю, що він говорив про оптимізацію низького рівня, тоді як я говорю про оптимізацію високого рівня.
Пам'ятайте, що ця цитата спочатку з 1974 року. У 1974 році комп'ютери були повільними, а обчислювальна потужність була дорогою, що дало деяким розробникам схильність до надмірного оптимізації. Я думаю, що саме на це натискав Кнут. Він не казав "не хвилюйся про продуктивність", тому що в 1974 році це були просто шалені розмови. Кнут пояснював, як оптимізувати; коротше кажучи, слід зосередитись лише на вузьких місцях, і перед цим потрібно виконати вимірювання, щоб знайти вузькі місця.
Зауважте, що ви не можете знайти вузькі місця, поки ви не складете програму для вимірювання, а це означає, що деякі рішення про ефективність повинні бути прийняті до того, як щось можна буде виміряти. Іноді ці рішення важко змінити, якщо ви їх помилилися. З цієї причини добре мати загальне уявлення про те, що коштують речі, щоб ви могли приймати обґрунтовані рішення, коли відсутні важкі дані.
Як рано оптимізуватись і скільки турбуватися про ефективність роботи, залежить від роботи. Коли ви пишете сценарії, які ви будете виконувати лише кілька разів, турбота про продуктивність взагалі - це повна марна трата часу. Але якщо ви працюєте в Microsoft або Oracle, і ви працюєте над бібліотекою, яку тисячі інших розробників збираються використовувати тисячами різних способів, можливо, це заплатить за оптимізацію пекла, щоб ви могли охопити все різноманітне ефективно використовувати випадки. Незважаючи на це, потреба в продуктивності повинна завжди бути врівноваженою проти потреби в читабельності, ремонтопридатності, елегантності, розширюваності тощо.