マルチサイクルパフォーマンスの最適化

1079 ワード

簡単に述べる
サイクル回数が多く,サイクル層数が多い場合,プログラム効率の問題は非常に顕著である.最適化された多重forサイクルは,大半の効率を向上させることができる.
方法
一、インスタンス化変数はできるだけforサイクルの外に置いて、一度だけインスタンス化する.二、普通変数をレジスタ変数に変更し、例えばi++を++iに変更する.前置インクリメント演算は不要な作業を回避し、値を1に加算した後、直接戻って演算オブジェクト自体を変更します.三、条件の比較使用は<=より速い.四、外層を計算できるだけ外層に置く.判断条件のある文がループに関係しない操作文はforの外にできるだけ置く.五、最も長いサイクルを最内層に置き、サイクル回数が最も少ないものを最外層に置き、CPUがサイクル層を横切る回数を減らす.
for (row = 0; row < 100; ++row)
{
  for (col =0; col < 5; ++col)
  {
    sum = sum + a[row][col];
  }
}

上記のコードのように、効率が低い.rowを内層に置くと効率が向上します.六、結合及び交換可能な連結操作については、連結操作のセットを2つ以上の部分に分割し、最終的に結果を連結することによって性能を向上させることができる.一般コードではCPUの1つのレジスタしか利用できず、分割して複数のレジスタを利用できるのが原理です.分割が1つの数に達すると、レジスタが切れ、パフォーマンスが向上せず、低下し始めます.コードの例は次のとおりです.
//      
for (int i = 1; i < n+1; ++i)
{
  res = res OPER i;
}
//       
for (int i = 1; i < n; i+=2)
{
  res1 = res1 OPER i;
  res2 = res2 OPER (i+1);
}

テストにより、この方法を採用すると、浮動小数点数の計算性能が向上し、明らかに整数より大きいことが分かった.乗算計算のパフォーマンスが向上し、加算よりやや大きくなります.
最後に書く
参照リンク:[https://blog.csdn.net/u011236602/article/details/81092504]