Performance 返回向量或通过引用传递
我正在编写一个ODE积分器,它在每一步计算dy/dx,之后不需要它。似乎只分配一个空间并使用那个空间会更快,这样我就不用花时间分配一个新的dydx向量了。编译器是否对此进行了优化? 换句话说,哪一个更好 (一)Performance 返回向量或通过引用传递,performance,function,c++11,pass-by-reference,pass-by-value,Performance,Function,C++11,Pass By Reference,Pass By Value,我正在编写一个ODE积分器,它在每一步计算dy/dx,之后不需要它。似乎只分配一个空间并使用那个空间会更快,这样我就不用花时间分配一个新的dydx向量了。编译器是否对此进行了优化? 换句话说,哪一个更好 (一) vector-dydx(const-vector&x){ 向量dydx_-tmp(x.size()); 对于(大小i=0;i
vector-dydx(const-vector&x){
向量dydx_-tmp(x.size());
对于(大小i=0;i
或
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];
}
}
void更新\u dydx(向量和dydx,常量向量和x){
对于(大小i=0;i
还有一种情况是
(三)
矢量dydx×v(矢量x){
向量dydx_-tmp(x.size());
对于(大小i=0;i
这一点如下,但在本例中,这并不重要,因为
x
的内存稍后用于输出,所以编译器的RVO不会使用它。所有性能相关问题的最终答案是在与生产环境中运行的应用相同(或至少类似)的硬件上评测整个应用程序,但这是我的三分钱理论手稿:
- 在选项3)中传递值没有任何意义
- 向量dydx_-tmp(x.size());向量真的只是两个浮点数吗?@delnan它的范围从2到数千,它可以是编译时参数,也可以是运行时参数。操作是在整个向量上进行的。我只是尽量保持简单我编辑了我的答案以回应你的编辑,因为
只有2个元素。它也可以有数千个。我只是把事情简化了,使你的函数实际上看起来像(i=0;ix
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]; } }
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; }