【问题标题】:C++ Function Call very slowC++ 函数调用非常慢
【发布时间】:2013-01-30 13:29:48
【问题描述】:

我已经写了一个递归的 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 倍,完美!

【问题讨论】:

  • 该函数的参数可能超出您所在司法管辖区的法律限制。
  • Graph 对象有多大?
  • 如果你的函数有这么多参数,你可能漏掉了一些。
  • 你是在递归调用 foo 吗?
  • 如果你需要传递这么多参数,那你就错了。这就是抽象的目的:你不需要这样做。

标签: c++ performance function call


【解决方案1】:

虽然向函数传递许多参数的设计不太好,但不会显着减慢速度(假设您通过引用传递所有内容)。但是我注意到您将副本传递给某些东西,特别是 Graph F,这似乎是一件大事。

【讨论】:

  • 盯着你的代码看足够长的时间,你会失明......这是一个提升图,它可能确实是问题所在,谢谢你发现这个!
  • +1 用于实际查看参数,而不仅仅是像我一样将其读取为 void allcomb(bunch of arguments go here) :)
【解决方案2】:

只是猜测,但是:

   time2 = toc
}

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

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

在这种情况下,您没有安排销毁时间。如果您在自动存储中有大量向量,它们的销毁可能需要很长时间。

试试这个实验:

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

如果测量的时间更接近,那就是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2015-04-02
    • 2015-08-28
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多