Мы должны забыть о малой эффективности, скажем, примерно в 97% случаев: преждевременная оптимизация — корень всех зол. Тем не менее, мы не должны упускать наши возможности в отношении этих критических 3%

Дональд Кнут написал эту цитату еще в 1973 году, и уже более сорока лет инженеры-программисты спорят о ее достоверности. Актуально ли это в наши дни?

При правильных пропорциях так и есть. Преждевременная оптимизация отличается от (базовой) оптимизации. Очевидно, ключевое слово здесь Преждевременно. Саханд Саба красиво выразился:

Оптимизация до того, как у вас будет достаточно информации, чтобы сделать обоснованные выводы о том, где и как проводить оптимизацию.

Предпочтительно сначала написать хорошо спроектированное и читабельное программное обеспечение, а затем микрооптимизировать его. Подожди, микро?

Микро, потому что вы должны знать об использовании сложной и недоказанной «эвристики» вместо известного математически правильного алгоритма.

Еще одна ловушка в этом антипаттерне, о которой следует помнить, — это шестое наблюдение Рэндалла Хайда:

Наблюдение № 6. Инженеров-программистов заставили поверить, что их время более ценно, чем время процессора; поэтому трата циклов ЦП для сокращения времени разработки всегда является выигрышем. Однако они забыли, что время пользователей приложения более ценно, чем их время.

Учитывая, что вы знаете, какой алгоритм выбрать, его переоценка или преждевременная оптимизация — настоящая ловушка, о которой вас предупреждает антишаблон Преждевременная оптимизация.

Важно помнить, что сказал Рико Мариани: «Никогда не отказывайся от выступления случайно». Обратите внимание, он не сказал: «Никогда не отказывайтесь от выступления». Он сказал, что программисты не должны терять производительность случайно. Люди случайно отказываются от производительности, когда не понимают затрат, связанных с конструкциями, которые они используют в своих программах.

Примеры из жизни

В BrightScript, официальном языке Roku для разработки приложений канала, есть две структуры списка: roArray и roList. На самом деле roList является динамическим roArray.

В большинстве случаев, когда мне нужен список, я не буду тратить время на выбор между этими двумя: я пойду прямо к:

myList = [] 'создает roList

Почему мне все равно 97% времени, как утверждает Дональд Кнут? Потому что в большинстве случаев размер моих списков настолько мал, что любая оптимизация в этой области незначительна.

Однако я должен знать, каковы ограничения программного обеспечения, которое я пишу. Если бы я знал, что список будет содержать несколько пар элементов и никогда не будет увеличиваться в размере, и если последовательность находится в центре процесса, который потенциально может слишком долго блокировать поток рендеринга, я бы больше думал об этом.

Но это случается не чаще, чем в 3% случаев.

Источники: