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