最適化とは、既存のコードをより効率的に実行するプロセスです (高速化、および/またはリソース使用量の削減)。
プログラマーが最適化の必要性を証明していない場合、すべての最適化は時期尚早です。(たとえば、コードを実行して、許容できる時間枠内で正しい結果が得られるかどうかを判断します。これは、コードを実行して十分な速度で実行されるかどうかを「確認」するか、プロファイラーで実行してより慎重に分析するのと同じくらい簡単です) .
何かを適切にプログラミングするには、いくつかの段階があります。
1) ソリューションを設計し、適切で効率的なアルゴリズムを選択します。
2) 適切にコード化された、保守可能な方法でソリューションを実装します。
3) ソリューションをテストし、速度、RAM 使用量などの要件を満たしているかどうかを確認します (例: 「ユーザーが [保存] をクリックしたとき、1 秒未満で完了しますか?」 0.3 秒かかる場合、実際にはそうではありません。その時間を 0.2 秒に短縮するには、1 週間かけて最適化する必要があります)。
4)要件を満たしていない場合は、その理由を検討してください。ほとんどの場合、これは、問題をよりよく理解したので、ステップ (1) に進んでより良いアルゴリズムを見つけることを意味します。(簡単なプロトタイプを作成することは、多くの場合、これを安価に調査するための良い方法です)
5)それでも要件を満たしていない場合は、ランタイムの高速化に役立つ最適化の検討を開始します (たとえば、ルックアップ テーブル、キャッシュなど)。このプロセスを推進するために、プロファイリングは通常、コード内のボトルネックや非効率性を特定するのに役立つ重要なツールです。これにより、コードに費やした時間を最大限に活用できます。
かなり慣れ親しんだ問題に取り組んでいる経験豊富なプログラマーは、このプロセスを毎回物理的に実行するのではなく、精神的に最初のステップを飛び越えてからパターンを適用することができるかもしれないことを指摘しておく必要がありますが、これは単なる近道です。経験を通して得た
したがって、経験豊富なプログラマーがコードに自動的に組み込む多くの「最適化」があります。これらは「時期尚早の最適化」ではなく、「常識的な効率パターン」です。これらのパターンはすばやく簡単に実装できますが、コードの効率が大幅に向上するため、特別なタイミング テストを行って、それらが有益かどうかを判断する必要はありません。
- 不要なコードをループに入れない。(既存のループから不要なコードを削除する最適化に似ていますが、コードを 2 回書く必要はありません!)
- 何度も再計算するのではなく、中間結果を変数に格納します。
- その場で計算するのではなく、ルックアップ テーブルを使用して事前計算された値を提供します。
- 適切なサイズのデータ構造を使用する (たとえば、パーセンテージを long (64 ビット) ではなく 1 バイト (8 ビット) に格納すると、RAM の使用量が 1/8 になります)
- 個々のコンポーネントを多数描画するのではなく、事前に描画された画像を使用して複雑なウィンドウの背景を描画する
- 帯域幅の使用を最小限に抑えるために、低速接続で送信する予定のデータのパケットに圧縮を適用します。
- 高品質で適切な圧縮が得られる形式を使用できるスタイルで、Web ページの画像を描画します。
- そしてもちろん、技術的には「最適化」ではありませんが、そもそも正しいアルゴリズムを選択することです!
たとえば、プロジェクトの古いコードを置き換えました。私の新しいコードは決して「最適化」されていませんが、(元の実装とは異なり) 効率を念頭に置いて書かれています。その結果、私のものは 25 倍高速に実行されます - 単純に無駄がないからです。最適化して高速化できますか?はい、さらに 2 倍のスピードアップを簡単に実現できました。コードを最適化して高速化しますか? いいえ - 5 倍の速度向上で十分だったでしょう。私はすでに 25 倍を達成しています。この時点でさらに作業を行うと、貴重なプログラミング時間を無駄にするだけです。(ただし、要件が変更された場合は、将来コードを再検討できます)
最後に、もう 1 つ重要な点があります。あなたが取り組んでいる分野によって、満たさなければならない基準が決まります。ゲーム用のグラフィックス エンジンやリアルタイム組み込みコントローラー用のコードを作成している場合、多くの最適化を行っていることに気付くでしょう。メモ帳のようなデスクトップ アプリケーションを作成している場合、無駄が多すぎない限り、何も最適化する必要はないかもしれません。