Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 返回向量或通过引用传递_Performance_Function_C++11_Pass By Reference_Pass By Value - Fatal编程技术网

Performance 返回向量或通过引用传递

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

我正在编写一个ODE积分器,它在每一步计算dy/dx,之后不需要它。似乎只分配一个空间并使用那个空间会更快,这样我就不用花时间分配一个新的dydx向量了。编译器是否对此进行了优化? 换句话说,哪一个更好

(一)

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到数千,它可以是编译时参数,也可以是运行时参数。操作是在整个向量上进行的。我只是尽量保持简单我编辑了我的答案以回应你的编辑,因为
    x
    只有2个元素。它也可以有数千个。我只是把事情简化了,使你的函数实际上看起来像(i=0;ivoid 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;
    }