この引用が、明らかに悪いコードや、パフォーマンスは測定されていませんが、コードサイズを大きくしたり、読みやすさを損なうことなく、非常に簡単に高速化できるコードを正当化するために使用されることがよくあります。
一般的に、初期のマイクロ最適化は悪い考えかもしれません。ただし、マクロ最適化(O(N ^ 2)の代わりにO(log N)アルゴリズムを選択することなど)は多くの場合価値があり、O(N ^ 2)アルゴリズムと次に、O(log N)アプローチを支持して完全に破棄します。
言葉は注意かもしれ O(N ^ 2)アルゴリズムは、シンプルで書きやすいであれば、それは遅すぎることが判明した場合、あなたはずっと罪悪感なしに、後でそれを捨てることができます。ただし、両方のアルゴリズムが同様に複雑な場合、または予想されるワークロードが非常に大きいため、より高速なものが必要であることが既にわかっている場合は、早期に最適化することは、長期的に全体のワークロードを削減する適切なエンジニアリング決定です。
したがって、一般的に、適切なアプローチは、コードの記述を開始する前にオプションが何であるかを確認し、状況に最適なアルゴリズムを意識的に選択することだと思います。最も重要なことは、「時期尚早な最適化がすべての悪の根源」というフレーズは無知の言い訳にはなりません。キャリア開発者は、一般的な運用コストの一般的な考え方を持っている必要があります。たとえば、彼らは知っておくべきです
- 文字列は数字よりも高い
- 動的言語は静的に型付けされた言語よりもはるかに遅いこと
- リンクリストに対する配列/ベクトルリストの利点、およびその逆
- ハッシュテーブルを使用する場合、ソート済みマップを使用する場合、およびヒープを使用する場合
- (モバイルデバイスで動作する場合)「double」と「int」はデスクトップ上で同様のパフォーマンスを持ちますが(FPの方が高速かもしれません)、「double」はFPUのないローエンドモバイルデバイスでは100倍遅くなります。
- インターネットを介したデータ転送はHDDアクセスよりも遅く、HDDはRAMよりも大幅に遅く、RAMはL1キャッシュとレジスタよりもはるかに遅く、インターネット操作は無期限にブロックされる可能性があります(いつでも失敗します)。
また、開発者はデータ構造とアルゴリズムのツールボックスに精通している必要があります。これにより、ジョブに適したツールを簡単に使用できます。
十分な知識と個人的なツールボックスを使用すると、ほとんど楽に最適化できます。必要のない最適化に多くの努力を注ぐのは悪です(そして、私はそのtrapに何度も陥ることを認めています)。しかし、配列の代わりにセット/ハッシュテーブルを選択するか、string []の代わりにdouble []に数値のリストを保存するのと同じくらい簡単に最適化する場合は、なぜですか?ここではKnuthに反対するかもしれませんが、確信はありませんが、高レベルの最適化について話しているのに対して、彼は低レベルの最適化について話していたと思います。
覚えておいてください。その引用は元々1974年のものです。1974年にはコンピューターが遅く、計算能力が高かったため、一部の開発者は行ごとに過剰に最適化する傾向がありました。それがクヌースが押しのけたものだと思います。彼は「パフォーマンスについてまったく心配しないでください」と言っていませんでした。Knuthは最適化の方法を説明していました。つまり、ボトルネックにのみ焦点を当てる必要があります。その前に、ボトルネックを見つけるための測定を実行する必要があります。
測定するプログラムを作成するまで、ボトルネックを見つけることができないことに注意してください。つまり、測定する何かが存在する前に、パフォーマンスの決定を下す必要があります。誤った判断を下すと、これらの決定を変更するのが難しい場合があります。このため、ハードデータが利用できない場合に合理的な判断を下せるように、物価がいくらになるかを一般的に把握しておくことをお勧めします。
最適化の早さ、パフォーマンスの心配の程度は、仕事によって異なります。数回しか実行しないスクリプトを作成する場合、パフォーマンスを心配することは通常、時間の無駄です。しかし、MicrosoftまたはOracleで働いていて、他の何千人もの開発者が何千もの異なる方法で使用するライブラリに取り組んでいる場合、それを徹底的に最適化するためにお金を払うかもしれません。ユースケースを効率的に。それでも、パフォーマンスの必要性は、読みやすさ、保守性、優雅さ、拡張性などの必要性と常にバランスを取る必要があります。