[コンピュータシステムの詳細な理解]第5章-プログラムパフォーマンスの最適化

この章から始めて、次のステップはストレージとネットワークです。最初に主な矛盾を解決します。記録部分のみ。

 

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

 

おすすめ

転載: www.cnblogs.com/zhouys96/p/12702569.html