0

我正在编写一个 ODE 积分器,它在每一步都评估 dy/dx,之后不需要它。似乎只分配空间并使用该空间会更快,这样我就不会花时间分配新的 dydx 向量。编译器会优化这个吗?换句话说,哪个更好?

1)

vector<double> dydx(const vector<double>&x) {
  vector<double> dydx_tmp(x.size());
  for(size_t i = 0; i < x.size()/2; ++i) {
    dydx_tmp[2*i] = -x[2*i+1]; 
    dydx_tmp[2*i+1] = x[2*i];
  } 
  return dydx_tmp;
}

或 2),其中 dydx 已分配,只需要更新

void update_dydx(vector<double> & dydx, const vector<double> &x) {
  for(size_t i = 0; i < x.size()/2; ++i) {
    dydx[2*i] = -x[2*i+1]; 
    dydx[2*i+1] = x[2*i];
  } 
}

还有一种情况 3)

vector<double> dydx_by_v(vector<double> x) {
  vector<double> dydx_tmp(x.size());
  for(size_t i = 0; i < x.size()/2; ++i) {
    dydx_tmp[2*i] = -x[2*i+1]; 
    dydx_tmp[2*i+1] = x[2*i];
  } 
  return dydx_tmp;
}

遵循http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/但在这种情况下,这并不重要,因为x's 的内存稍后用于输出,所以它赢了'不被编译器的 RVO 使用。

4

1 回答 1

0

所有与性能相关的问题的最终答案是在与将在生产环境中运行的硬件相同(或至少相似)的硬件上分析您的整个应用程序,但这是我的三分钱理论:

  • 在选项 3) 中按值传递没有任何意义

  • 向量 dydx_tmp(x.size()); <- 这会导致默认构造(又名归零)您的向量。使用向量 dydx;dydx.reserve(x.size()); 然后循环中的 emplace_back() (将 _temp 添加到你的名字是没用的 - 每个人都可以看到它是本地的)

  • 选项 2) 涉及输入参数,该参数被认为是错误的样式,并且无论如何在选项 1) 中都不会复制(如您链接的文章中所述),因此 1) 是最佳选项

于 2013-07-09T15:17:06.427 回答