Варто зазначити, що оригінальна цитата Кнута вийшла з статті, яку він написав, пропагуючи використання goto
в ретельно відібраних та відмірених районах як спосіб усунення гарячих точок. Його цитата була застереженням, яке він додав, щоб виправдати свою аргументацію щодо використання goto
для пришвидшення цих критичних циклів.
[...] знову ж таки, це помітна економія на загальній швидкості бігу, якщо, скажімо, середнє значення n дорівнює приблизно 20, і якщо підпрограма пошуку виконується в програмі близько мільйона разів. Такі оптимізації циклу [з використанням gotos
] не важкі для вивчення, і, як я вже говорив, вони підходять лише для невеликої частини програми, проте вони часто дають значну економію. [...]
І продовжує:
Загальноприйнята мудрість, якою поділяються багато сучасних інженерів програмного забезпечення, вимагає ігнорувати ефективність роботи малого; але я вважаю, що це просто надмірна реакція на зловживання, які, на їхню думку, практикують безглузді програмісти, які не можуть налагоджувати чи підтримувати свої "оптимізовані" програми. У усталених інженерних дисциплінах покращення на 12%, яке легко отримати, ніколи не вважається граничним; і я вважаю, що та ж точка зору повинна переважати в розробці програмного забезпечення. Звичайно, я б не заважав робити такі оптимізації на одній роботі, але коли мова йде про підготовку якісних програм, я не хочу обмежуватися інструментами, які відмовляють мені в такій ефективності [тобто goto
заяви в цьому контексті].
Майте на увазі, як він використовував "оптимізовані" в лапках (програмне забезпечення, ймовірно, насправді не ефективно). Також зауважте, як він не просто критикує цих "безглуздих" програмістів, а й людей, які реагують, пропонуючи вам завжди ігнорувати дрібну неефективність. Нарешті, до часто цитованої частини:
Немає сумнівів, що грааль ефективності призводить до зловживань. Програмісти витрачають величезну кількість часу, думаючи про швидкість некритичних частин своїх програм або турбуючись про них, і ці спроби досягти ефективності насправді мають сильний негативний вплив при розгляді налагодження та обслуговування. Слід забути про малу ефективність, скажімо, 97% випадків; передчасна оптимізація - корінь усього зла.
... а потім ще трохи про важливість інструментів профілювання:
Часто помилково висловлювати апріорні судження про те, які частини програми насправді є критично важливими, оскільки універсальний досвід програмістів, які використовують інструменти вимірювання, полягає в тому, що їх інтуїтивні здогадки не вдаються. Попрацювавши з такими інструментами протягом семи років, я переконався, що всі компілятори, написані відтепер, повинні бути розроблені таким чином, щоб надавати всім програмістам зворотній зв'язок із зазначенням того, які частини їх програм коштують найбільше; справді, цей зворотний зв'язок повинен надходити автоматично, якщо він не був спеціально вимкнений.
Люди всюди зловживають його цитатами, часто припускаючи, що мікро-оптимізація передчасна, коли вся його стаття виступає за мікро-оптимізацію! Одна з груп людей, яку він критикував, повторює цю "загальноприйняту мудрість", вважаючи, що завжди ігнорує ефективність у малому, часто зловживає цитатою, яка спочатку була спрямована, зокрема, проти таких типів, які знеохочують всі форми мікрооптимізації. .
Проте це була цитата на користь відповідним чином застосованих мікрооптимізацій, коли їх використовує досвідчена рука, що тримає профілі. Сьогоднішній аналогічний еквівалент може виглядати так: "Люди не повинні робити незрячі удари при оптимізації свого програмного забезпечення, але користувальницькі розподільники пам'яті можуть мати величезну різницю, застосовуючи їх у ключових областях для покращення місцевості посилання", або " Рукописний SIMD-код із використанням Повторення SoA насправді важко підтримувати, і ви не повинні використовувати його повсюдно, але він може споживати пам'ять набагато швидше, якщо застосувати його належним чином досвідченою та керованою рукою ".
Кожного разу, коли ви намагаєтесь просувати ретельно застосовані мікрооптимізації, як Кнут просував вище, добре залишити застереження, щоб не дати новачкам занадто хвилюватися і сліпо робити удари при оптимізації, як, наприклад, переписати все своє програмне забезпечення на використання goto
. Це частково те, що він робив. Його цитата фактично була частиною великого застереження, так само, як хтось, хто робить стрибок на мотоциклі через палаючий вогнище, може додати застереження, що любителі не повинні пробувати це вдома, одночасно критикуючи тих, хто намагається без належних знань та обладнання та постраждає .
Те, що він вважав "передчасною оптимізацією", це оптимізації, що застосовуються людьми, які фактично не знали, що роблять: не знали, чи оптимізація дійсно потрібна, не вимірювали належними інструментами, можливо, не розуміли природи їх компілятор або комп'ютерна архітектура, і найбільше, були "безглуздими", тобто вони не помічали великих можливостей для оптимізації (заощаджували мільйони доларів), намагаючись зірвати копійки, і все, створюючи код, вони не могли довше ефективно налагоджувати та підтримувати.
Якщо ви не входите в категорію "безглуздо", тоді ви не достроково оптимізуєте за стандартами Кнута, навіть якщо використовуєте для goto
того, щоб пришвидшити критичний цикл (те, що малоймовірно щоб допомогти проти сучасних оптимізаторів, але якби це було зроблено, і в справді критичній області, то ви б не передчасно оптимізували). Якщо ви насправді застосовуєте все, що робите, у сферах, які справді потрібні, і вони від цього отримують справжню вигоду, то в очах Кнута у вас виходить чудово.