C ++函数调用非常慢

时间:2013-01-30 13:29:49

标签: c++ performance function call

我编写了一个递归的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 )

我通过引用传递所有向量以避免复制它们,但也许我错过了什么?或者通常使用那么多参数调用函数通常很慢? 此外,进入该功能所花费的时间比退出该功能更多,这可能很重要。

如果您需要更多信息,请告诉我。 谢谢和欢呼,Christoph


提升图形对象是问题,感谢发现它:)运行时间降低了10倍,完美无缺!

2 个答案:

答案 0 :(得分:7)

虽然没有那么好的设计将许多参数传递给函数但不会显着降低速度(假设您通过引用传递所有内容)。但是我注意到你将副本传递给特别是Graph F的某些内容,这似乎是一件很重要的事情。

答案 1 :(得分:5)

只是一个猜测,但是:

   time2 = toc
}

我猜测罪魁祸首是}。说你有类似的东西:

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

在这种情况下,你没有计时破坏。如果在自动存储中有大量载体,它们的破坏可能需要很长时间。

尝试此实验:

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

如果测得的时间更近,那就是问题。