Knuthの最初の引用は、goto
ホットスポットを排除する方法として慎重に選択および測定された領域での使用を促進するために彼が書いた論文からのものであったことは注目に値します。彼の引用は、goto
これらの重要なループを高速化するために使用する理由を正当化するために彼が追加した警告でした。
[...]繰り返しになりますが、たとえば、nの平均値が約20であり、プログラムで検索ルーチンが約100万回実行された場合、これは全体の実行速度の顕著な節約になります。[を使用したgotos
]このようなループ最適化は、習得するのが難しくなく、私が言ったように、プログラムのごく一部で適切ですが、多くの場合、大幅な節約になります。[...]
そして続けます:
今日のソフトウェアエンジニアの多くが共有している一般通念は、小規模での効率を無視することを求めています。しかし、これは、「最適化された」プログラムをデバッグまたは維持できないペニーワイズおよびポンドバカなプログラマーによって実践されていると彼らが見ている虐待に対する単なる過剰反応であると私は信じています。確立された工学分野では、簡単に得られる12%の改善は、限界とは見なされません。ソフトウェア工学でも同じ視点が普及するはずだと思います。もちろん、ワンショットの仕事でそのような最適化を行うことはしませんが、質の高いプログラムを準備することが問題になる場合は、そのような効率を否定するツール[つまり、goto
このコンテキストでのステートメント]に制限したくありません。
彼が引用符で「最適化」をどのように使用したかを覚えておいてください(ソフトウェアはおそらく実際には効率的ではありません)。また、彼がこれらの「ペニーワイズアンドパウンドバカ」プログラマーを批判しているだけでなく、小さな非効率性を常に無視するように提案して反応する人々にも注意してください。最後に、頻繁に引用される部分に:
効率の目標が悪用につながることは間違いありません。プログラマーは、プログラムの重要でない部分の速度について考えたり心配したりするのに膨大な時間を浪費します。これらの効率化の試みは、デバッグと保守を考慮すると、実際には大きな悪影響を及ぼします。小さな効率、たとえば97%の時間は忘れておく必要があります。時期尚早の最適化はすべての悪の根源です。
...そしてプロファイリングツールの重要性についてもう少し:
測定ツールを使用しているプログラマーの普遍的な経験では、直感的な推測が失敗するため、プログラムのどの部分が本当に重要であるかを事前に判断することはしばしば間違いです。このようなツールを7年間使用した後、これから作成するすべてのコンパイラーは、プログラムのどの部分が最もコストがかかるかを示すフィードバックをすべてのプログラマーに提供するように設計する必要があると確信しました。実際、このフィードバックは、特にオフにされていない限り、自動的に提供される必要があります。
人々は彼の引用をあちこちで誤用しており、彼の論文全体がマイクロ最適化を提唱していたとき、マイクロ最適化は時期尚早であるとしばしば示唆しています!彼が批判していた人々のグループの1つは、この「一般通念」を繰り返し、小さなものの効率を常に無視していると述べ、元々はあらゆる形態のマイクロ最適化を思いとどまらせるようなタイプに対して部分的に向けられた彼の引用を誤用していることがよくあります。 。
それでも、プロファイラーを持っている経験豊富な手が使用した場合、適切に適用されたマイクロ最適化を支持する引用でした。、のような今日の類推相当するものはあるかもしれない「人々は彼らのソフトウェアの最適化をブラインドのスタブを取るべきではありませんが、参照の局所性を向上させるための重要な分野に適用されるときにカスタムメモリアロケータは、大きな違いを生むことができ、」または、 "手書きSIMDコードを使用してSoA担当者は保守が非常に難しく、あらゆる場所で使用するべきではありませんが、経験豊富でガイド付きの手によって適切に適用されると、メモリをはるかに速く消費する可能性があります。」
Knuthが上記で宣伝したように、慎重に適用されたマイクロ最適化を宣伝しようとしているときはいつでも、ソフトウェア全体を使用するように書き直すなど、初心者が興奮しすぎて盲目的に最適化を突き刺さないように、免責事項を提出することをお勧めしますgoto
。それは部分的に彼がしていたことです。彼の引用は事実上大きな免責事項の一部でした。ちょうどオートバイが燃える火の穴を飛び越えるのと同じように、アマチュアは家でこれを試してはいけないという免責事項を追加すると同時に、適切な知識と設備なしで試して怪我をする人を批判します。
彼が「時期尚早の最適化」と見なしたのは、彼らが何をしているのかを事実上知らなかった人々によって適用された最適化でした。最適化が本当に必要かどうかわからなかった、適切なツールで測定しなかった、多分彼らのコンパイラまたはコンピュータアーキテクチャ、そして何よりも、「ペニーワイズアンドパウンドバカ」でした。つまり、ペニーをつまんで最適化する(数百万ドルを節約する)大きな機会を見落としていました。より効果的にデバッグおよび保守します。
「ペニーワイズアンドパウンドバカ」のカテゴリに当てはまらない場合はgoto
、クリティカルループを高速化するためにを使用している場合でも、クヌースの標準によって時期尚早に最適化されていません(ありそうもないことです)。今日のオプティマイザーに対して大いに役立つが、もしそうなら、そして本当に重要な領域では、時期尚早に最適化することはないだろう)。あなたが本当に必要とされている分野であなたがしていることを実際に適用していて、彼らがそれから本当に恩恵を受けているなら、あなたはクヌースの目にはちょうど素晴らしいことをしています。