Я часто видел, как эта цитата использовалась для обоснования явно плохого кода или кода, который, хотя его производительность не была измерена, возможно, можно было бы сделать довольно быстро, без увеличения размера кода или снижения его читабельности.
В целом, я думаю, что ранняя микрооптимизация может быть плохой идеей. Однако макрооптимизация (например, выбор алгоритма O (log N) вместо O (N ^ 2)) часто имеет смысл и должна быть сделана рано, поскольку написание алгоритма O (N ^ 2) и затем выбросить его полностью в пользу подхода O (log N).
Обратите внимание, что слова могут быть следующими : если алгоритм O (N ^ 2) прост и легко написать, вы можете выбросить его позже без особой вины, если он окажется слишком медленным. Но если оба алгоритма одинаково сложны или ожидаемая рабочая нагрузка настолько велика, что вы уже знаете, что вам понадобится более быстрый, то ранняя оптимизация - это разумное инженерное решение, которое в долгосрочной перспективе уменьшит вашу общую рабочую нагрузку.
Таким образом, в целом, я думаю, что правильный подход состоит в том, чтобы выяснить, какие у вас есть варианты, прежде чем вы начнете писать код, и сознательно выбрать лучший алгоритм для вашей ситуации. Самое главное, что фраза «преждевременная оптимизация - корень всего зла» не оправдывает невежество. Карьерный разработчик должен иметь общее представление о том, сколько стоят общие операции; они должны знать, например,
- что строки стоят больше, чем числа
- что динамические языки намного медленнее, чем языки со статической типизацией
- преимущества списков массивов / векторов над связанными списками и наоборот
- когда использовать хеш-таблицу, когда использовать отсортированную карту и когда использовать кучу
- что (если они работают с мобильными устройствами) «double» и «int» имеют одинаковую производительность на настольных компьютерах (FP может быть даже быстрее), но «double» может быть в сто раз медленнее на мобильных устройствах низкого уровня без FPU;
- что передача данных через Интернет происходит медленнее, чем доступ к жестким дискам, жесткие диски значительно медленнее, чем ОЗУ, ОЗУ намного медленнее, чем кэш-память L1 и регистры, а операции в Интернете могут блокироваться бесконечно (и в любой момент завершиться сбоем).
И разработчики должны быть знакомы с набором инструментов структур данных и алгоритмов, чтобы они могли легко использовать правильные инструменты для работы.
Обладая достаточными знаниями и личным инструментарием, вы можете оптимизировать работу практически без усилий. Вкладывать много усилий в оптимизацию, которая может оказаться ненужной, - зло (и я признаю, что попадал в эту ловушку не раз). Но если оптимизация так же проста, как выбор набора / хеш-таблицы вместо массива или сохранение списка чисел в double [] вместо string [], то почему бы и нет? Возможно, я не согласен с Кнутом здесь, я не уверен, но я думаю, что он говорил об оптимизации низкого уровня, тогда как я говорю об оптимизации высокого уровня.
Помните, что эта цитата была написана в 1974 году. В 1974 году компьютеры работали медленно, а вычислительная мощность была дорогой, что давало некоторым разработчикам тенденцию к чрезмерной оптимизации, построчно. Я думаю, что это то, против чего Кнут добивался. Он не говорил «вообще не беспокойся о производительности», потому что в 1974 году это было бы просто сумасшествием. Кнут объяснял, как оптимизировать; Короче говоря, следует сосредоточиться только на узких местах, и, прежде чем сделать это, вы должны выполнить измерения, чтобы найти узкие места.
Обратите внимание, что вы не можете найти узкие места, пока не напишете программу для измерения, а это означает, что некоторые решения о производительности должны быть приняты до того, как что-либо измерить. Иногда эти решения трудно изменить, если вы ошибаетесь. По этой причине хорошо иметь общее представление о том, что стоит, чтобы вы могли принимать разумные решения, когда нет надежных данных.
Как рано оптимизировать, и сколько беспокоиться о производительности, зависит от работы. При написании сценариев, которые вы запускаете всего несколько раз, беспокойство по поводу производительности обычно является пустой тратой времени. Но если вы работаете на Microsoft или Oracle и работаете над библиотекой, которую тысячи других разработчиков будут использовать тысячами различных способов, это может оказаться полезным для оптимизации, так что вы сможете охватить все разнообразные эффективно использовать варианты. Тем не менее, потребность в производительности всегда должна быть сбалансирована с потребностью в удобочитаемости, удобстве обслуживания, элегантности, расширяемости и так далее.