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 )

我通过引用传递所有向量以避免复制它们,但也许我遗漏了什么?还是经常调用具有这么多参数的函数通常很慢?另外,进入函数比退出函数花费更多的时间,也许这很重要。

如果您需要更多信息,请告诉我。谢谢和欢呼,克里斯托夫


boost Graph 对象是问题所在,感谢您发现它 :) 运行时间降低了 10 倍,完美!

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 回答