Стоит отметить, что оригинальная цитата Кнута взята из статьи, которую он написал, продвигая использование goto
в тщательно выбранных и измеренных областях как способ устранения горячих точек. Его цитата была предостережением, которое он добавил, чтобы оправдать его использование goto
для ускорения этих критических циклов.
[...] опять же, это заметная экономия в общей скорости выполнения, если, скажем, среднее значение n составляет около 20, и если процедура поиска выполняется в программе около миллиона раз. Такую оптимизацию цикла [с использованием gotos
] нетрудно изучить, и, как я уже сказал, они подходят только для небольшой части программы, но часто дают значительную экономию. [...]
И продолжает:
Общепринятая мудрость, которой придерживаются многие современные инженеры-программисты, призывает игнорировать эффективность в малом; но я считаю, что это просто чрезмерная реакция на злоупотребления, которые, как они видят, практикуются глупыми программистами, которые не могут отлаживать или поддерживать свои «оптимизированные» программы. В общепринятых инженерных дисциплинах легко достижимое улучшение на 12% никогда не считается маргинальным; и я считаю, что такая же точка зрения должна преобладать в разработке программного обеспечения. Конечно, я бы не стал утруждать себя такой оптимизацией в одночасье, но когда речь идет о подготовке качественных программ, я не хочу ограничиваться инструментами, которые отказывают мне в такой эффективности [т. Е. goto
Заявлениях в этом контексте].
Не забывайте, как он использовал слово «оптимизировано» в кавычках (программное обеспечение, вероятно, на самом деле неэффективно). Также обратите внимание на то, как он критикует не только этих глупых программистов, но и людей, которые в ответ предлагают вам всегда игнорировать мелкие недостатки. Наконец, к часто цитируемой части:
Нет сомнений, что грааль эффективности ведет к злоупотреблениям. Программисты тратят огромное количество времени на размышления или беспокойство о скорости некритических частей своих программ, и эти попытки повышения эффективности на самом деле имеют сильное негативное влияние, когда рассматриваются отладка и обслуживание. Мы должны забыть о небольшой эффективности, скажем, в 97% случаев; Преждевременная оптимизация - корень всех зол.
... а затем еще немного о важности инструментов профилирования:
Часто ошибочно делать априорные суждения о том, какие части программы действительно критичны, поскольку универсальный опыт программистов, использующих инструменты измерения, показывает, что их интуитивные догадки терпят неудачу. Проработав с такими инструментами в течение семи лет, я пришел к убеждению, что все компиляторы, написанные с этого момента, должны быть разработаны так, чтобы обеспечивать всех программистов обратной связью, указывающей, какие части их программ стоят больше всего; действительно, эта обратная связь должна предоставляться автоматически, если она не была специально отключена.
Люди повсюду злоупотребляли его цитатой, часто предполагая, что микрооптимизации преждевременны, когда вся его статья пропагандировала микрооптимизации! Одна из групп людей, которых он критиковал, которые повторяют эту «общепринятую точку зрения», поскольку он всегда игнорирует эффективность в малом, часто неправильно используют его цитату, которая первоначально была направлена, отчасти, против таких людей, которые препятствуют всем формам микрооптимизации. .
Тем не менее, это была цитата в пользу правильно примененных микрооптимизаций при использовании опытным человеком, держащим профилировщик. Сегодняшний аналогичный эквивалент может выглядеть так: «Людям не следует слепо пытаться оптимизировать свое программное обеспечение, но настраиваемые распределители памяти могут иметь огромное значение при применении в ключевых областях для улучшения локальности ссылок» или « Рукописный код SIMD с использованием SoA rep действительно сложно поддерживать, и вы не должны использовать его повсюду, но он может потреблять память намного быстрее, если применять его соответствующим образом опытной и управляемой рукой ».
Каждый раз, когда вы пытаетесь продвигать тщательно применяемые микрооптимизации, как продвигал Кнут выше, полезно сделать заявление об отказе от ответственности, чтобы не дать новичкам слишком волноваться и вслепую пытаться оптимизировать, например, переписывать все свое программное обеспечение для использования goto
. Отчасти это он и делал. Его цитата фактически была частью большого отказа от ответственности, точно так же, как кто-то, прыгая на мотоцикле через пылающую костровую яму, может добавить отказ от ответственности, что любители не должны пробовать это дома, одновременно критикуя тех, кто пытается без надлежащих знаний и оборудования и получает травму. .
То, что он считал «преждевременной оптимизацией», было оптимизацией, применявшейся людьми, которые фактически не знали, что они делают: не знали, действительно ли оптимизация нужна, не измеряли с помощью соответствующих инструментов, возможно, не понимали природу их компилятор или компьютерная архитектура, и, что самое главное, были «глупыми на копейки и фунтами», то есть они упустили из виду большие возможности оптимизации (сэкономить миллионы долларов), пытаясь скупить копейки, и все время при создании кода они не могли дольше эффективно отлаживать и поддерживать.
Если вы не попадаете в категорию «глупых и глупых», то вы не преждевременно оптимизируете по стандартам Кнута, даже если вы используете goto
, чтобы ускорить критический цикл (что маловероятно чтобы сильно помочь против сегодняшних оптимизаторов, но если бы это было так, и в действительно критической области, то вы не стали бы преждевременно оптимизировать). Если вы действительно применяете то, что делаете, в тех областях, которые действительно необходимы, и они действительно получают от этого выгоду, то в глазах Кнута вы делаете просто отлично.