我正在编写一个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
的内存稍后用于输出,因此编译器的RVO不会使用它。
答案 0 :(得分:0)
所有与性能相关的问题的最终答案是将您的整个应用程序分析到与生产环境中运行的硬件相同(或至少类似)的硬件,但这是我理论制作的三分钱:
在选项3中传递值没有任何意义
vector dydx_tmp(x.size()); &lt; - 这会导致默认构造(也就是归零)你的向量。使用矢量dydx; dydx.reserve(x.size());然后在循环中使用emplace_back()(将_temp添加到你的名字是没用的 - 每个人都可以看到它是本地的)
选项2)涉及输入参数,该参数被认为是错误的样式,并且在选项1)中将没有副本(如您链接的文章中所述),因此1)是最佳选项