この章から始めて、次のステップはストレージとネットワークです。最初に主な矛盾を解決します。記録部分のみ。
- [メモリエイリアスの使用]着信パラメーターがポインターと見なされる場合、コンパイラーはパラメーターを直接最適化できません。以下に例を示します。実際、memcpyのような関数を作成するには、配列のコピーに2つのポインターを渡すときに、dstポインターが指すアドレスがsrc配列と一致するかどうかも確認する必要があります。最適化はコンパイラーによって行われ、コードは人間によって書かれ、そのすべてに注意深い考慮が必要です。
- [コード移動]繰り返し計算をループから外します。たとえば、(int i = 0; i <vec_int.size(); ++ i)の場合。もちろん、コンパイラがこれを最適化するかどうかはわかりません。
- 【分岐予測&投機実行】
- ICU(命令制御ユニット)は、命令からキャッシュに命令シーケンスを読み取り、オペレーションを生成します。Retirement Unitは進行中の処理を記録し、マシンレベルのプログラムのシーケンスセマンティクスを尊重することを保証します。
- EU(実行ユニット、実行ユニット):ICUによって生成された操作を実行します
- [Pentium III演算のパフォーマンス]整数除算(36)と浮動小数点除算(38)の実行時間と起動時間は感動的です。プロセッサーによってパフォーマンスは異なりますが、勉強していると気づきませんでした。
- [ループ開発]並列最適化。例:奇数ビットの乗算と偶数ビットの乗算。ただし、並列度はレジスタの数によって制限されます。
- 【プログラムのパフォーマンスを最適化するための基本戦略】
- 高度な設計:適切なアルゴリズムとデータ構造を選択します。
- 基本的なコーディングの原則:
- 継続的な関数呼び出しを排除します。可能な場合は、計算をループの外に移動します。
- 不要なメモリ参照を排除します。中間結果を保存するために一時変数を導入します。最終値を計算したら、結果を配列またはグローバル変数に格納します。
- 低レベルの最適化
- 配列コードに関連するさまざまな形式のポインターを試してください。
- ループ展開
- 反復セグメンテーション
- 最後に、正確さが最も重要です!
- [プロファイリング] Unixシステムは、プロファイリングプログラムGPROFを提供します。
- タイミングはあまり正確ではありません。単純なインターバル手法に基づいています。
- 通話情報は非常に信頼できます。
- デフォルトでは、ライブラリ関数の呼び出しは表示されません。