1

C ++で2つのdouble配列(double **)を交換する次の方法があります。コードをプロファイリングすると、メソッドは実行時間の 7% を占めています...これは低コストの操作であるべきだと考えていましたが、何か提案はありますか? 私はC ++を初めて使用しますが、配列への参照を交換することを望んでいました。

 62 void Solver::Swap(double** &v1, double** &v2)
 63 {
 64         double** vswap = NULL;
 65         vswap = v2;
 66         v2 = v1;
 67         v1 = vswap;
 68 }
4

5 に答える 5

4

1) 関数がインライン化されていることを確認します。

2)たとえばXORを使用して、スワップをインプレースできます

3)スタックの代わりにレジスタを使用して引数を渡すようにコンパイラに強制してみてください(x86には多くのレジスタストレスがありますが、試してみる価値があります)-標準registerキーワードを使用するかfastcall、MSのコンパイラで遊ぶことができます。

typedef double** TwoDimArray;

class Solver
{
  inline void Swap( register TwoDimArray& a, register TwoDimArray& b )
  {
    a ^= b ^= a ^= b;
  }
};

4) などの一時変数にデフォルト値を指定する必要はありませんvswap

于 2009-10-09T12:15:13.500 に答える
3

コードは問題ないようです。それは単なるポインタの割り当てです。メソッドが呼び出された回数によって異なります。

于 2009-10-09T11:48:43.323 に答える
1

完全に最適化されたコードをプロファイリングしましたか?

inlineこの機能を使用する必要があります。

それ以外に私が目にする唯一のことは、最初に他の値を割り当て、その後すぐに他の値を割り当てていることですが、これはオプティマイザーが処理する必要がありますNULLvswap

 inline void Solver::Swap(double** &v1, double** &v2)
 {
   double** vswap = v2;
   v2 = v1;
   v1 = vswap;
 }

しかし、なぜあなたは使わないのですstd::swap()か?

于 2009-10-09T12:18:10.517 に答える
1

このメソッドは実際には 2 つのポインターしか交換しないため、プロファイラーはここで少し混乱していると思います。これは非常に安価です。このメソッドが頻繁に呼び出されない限り、プロファイルに表示されるべきではありませんプロファイラーは、このメソッドが呼び出される頻度を示していますか?

スワッピングで注意しなければならない問題の 1 つは、1 つの配列がキャッシュにあり、もう 1 つの配列がキャッシュにない (特にサイズが大きい場合) 可能性があることです。下。

于 2009-10-09T11:49:17.473 に答える
0

7% がこの操作が遅いことを意味するとは思わないでください。他に何が起こっているかによって異なります

1 ナノ秒しかかからない操作を行うことができ、他に何もせずにほぼ 100% の時間を費やすことができます。

于 2010-02-19T15:21:47.550 に答える