2

私は再帰的な Branch&Cut アルゴリズムを作成し、実行速度を上げようとしています。ただし、非常に興味深いことに気付きました。ある時点で、ベクトルのベクトルを計算する関数を呼び出しています。clock() を使用して、この関数が呼び出されたファイルと関数自体で、この関数に費やされた時間を測定しました。視覚化:

tic
foo(args);
time1 = toc

void foo(args) {
  tic
  //do stuff
  time2 = toc
}

私の問題は、time1 が time2 よりも約 3 倍大きいことです。これは私にはまったく意味がありません。実際の関数には多くの引数があり、次のようになります。

void allcomb( std::vector<int> &Vin, 
              std::vector<int> &Vprev, 
              Graph F, 
              int t, 
              const int n, 
              const int numofdests, 
              int Time_hor,
              std::vector<int> &truckdest, 
              std::vector<int> &truck_dest_index, 
              std::vector<int> &descroflabel, 
              std::vector<int> &labelofdescr, 
              std::vector<std::vector<double> > &short_path_time,  
              std::vector<std::vector<double> > &short_path_fuel, 
              double eta, 
              std::vector<std::pair<int,int> >& next_hub,
              std::vector<std::pair<double,double> >& distanceto_next_hub, 
              std::vector<std::vector<int> >& Choices )

コピーを避けるためにすべてのベクトルを参照で渡しますが、何か不足している可能性がありますか? それとも、それほど多くの引数を持つ関数を頻繁に呼び出すのは一般的に遅いのでしょうか? また、関数に入ると、終了するよりも時間がかかります。これは重要なことかもしれません。

さらに情報が必要な場合は、教えてください。ありがとう、クリストフ


ブースト グラフ オブジェクトが問題でした。見つけてくれてありがとう :) 実行時間が 10 分の 1 に短縮されました。完璧です。

4

2 に答える 2

7

あまり良い設計ではありませんが、関数に多くの引数を渡しても、大幅に速度が低下することはありません (参照によってすべてを渡すと仮定します)。ただし、特にいくつかのものにコピーを渡すことに気付きましたGraph F。それは大きなものになる可能性があるようです。

于 2013-01-30T13:33:46.320 に答える
5

推測ですが、次のとおりです。

   time2 = toc
}

犯人は}. 次のようなものがあるとします。

void foo(args) {
  tic
  SomeReallyExpensiveObject x;
  time2 = toc
}

その場合、破壊のタイミングを計っていません。自動ストレージ内に大量のベクトルがある場合、それらの破壊には長い時間がかかる可能性があります。

この実験を試してください:

void foo(args) {
  tic
  {
     //do stuff
  }
  time2 = toc
}

測定時間が近づくと、それが問題です。

于 2013-01-30T13:35:35.877 に答える