Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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
C++中的二维双数组交换 我有以下方法来交换C++中的两个双数组双**。分析代码时,该方法占运行时的7%。。。我想这应该是一个低成本的操作,有什么建议吗?我是C++的新手,但我希望能把引用转换成数组。 62 void Solver::Swap(double** &v1, double** &v2) 63 { 64 double** vswap = NULL; 65 vswap = v2; 66 v2 = v1; 67 v1 = vswap; 68 }_C++_G++_Gprof - Fatal编程技术网

C++中的二维双数组交换 我有以下方法来交换C++中的两个双数组双**。分析代码时,该方法占运行时的7%。。。我想这应该是一个低成本的操作,有什么建议吗?我是C++的新手,但我希望能把引用转换成数组。 62 void Solver::Swap(double** &v1, double** &v2) 63 { 64 double** vswap = NULL; 65 vswap = v2; 66 v2 = v1; 67 v1 = vswap; 68 }

C++中的二维双数组交换 我有以下方法来交换C++中的两个双数组双**。分析代码时,该方法占运行时的7%。。。我想这应该是一个低成本的操作,有什么建议吗?我是C++的新手,但我希望能把引用转换成数组。 62 void Solver::Swap(double** &v1, double** &v2) 63 { 64 double** vswap = NULL; 65 vswap = v2; 66 v2 = v1; 67 v1 = vswap; 68 },c++,g++,gprof,C++,G++,Gprof,代码看起来不错。它只是一个指针赋值。这取决于调用该方法的次数。代码看起来不错。它只是一个指针赋值。这取决于该方法被调用的次数。我猜您的分析器在这里有点困惑,因为该方法实际上只交换两个指针,这非常便宜。除非经常调用此方法,否则它不应显示在配置文件中。您的分析器是否告诉您调用此方法的频率 交换时您必须注意的一个问题是,一个数组可能在缓存中,另一个数组可能不在缓存中,特别是当它们很大时,因此不断交换指针可能会破坏缓存,但这会显示为总体速度减慢。我猜您的探查器在这里有点困惑,因为此方法实际上只交换两个指

代码看起来不错。它只是一个指针赋值。这取决于调用该方法的次数。

代码看起来不错。它只是一个指针赋值。这取决于该方法被调用的次数。

我猜您的分析器在这里有点困惑,因为该方法实际上只交换两个指针,这非常便宜。除非经常调用此方法,否则它不应显示在配置文件中。您的分析器是否告诉您调用此方法的频率


交换时您必须注意的一个问题是,一个数组可能在缓存中,另一个数组可能不在缓存中,特别是当它们很大时,因此不断交换指针可能会破坏缓存,但这会显示为总体速度减慢。

我猜您的探查器在这里有点困惑,因为此方法实际上只交换两个指针,非常便宜。除非经常调用此方法,否则它不应显示在配置文件中。您的分析器是否告诉您调用此方法的频率


交换时必须注意的一个问题是,一个数组可能在缓存中,而另一个数组可能不在缓存中,特别是当它们很大时,因此不断交换指针可能会损坏缓存,但这会显示为总体速度减慢。

1确保函数是内联的

2您可以就地交换,例如使用XOR

3尝试强制编译器使用寄存器而不是堆栈传递参数,即使x86上存在大量寄存器压力,也值得一试——您可以在MS的编译器上使用标准寄存器关键字或使用fastcall

typedef double** TwoDimArray;

class Solver
{
  inline void Swap( register TwoDimArray& a, register TwoDimArray& b )
  {
    a ^= b ^= a ^= b;
  }
};

4不要麻烦为诸如vswap之类的临时函数提供默认值。

1确保函数是内联的

2您可以就地交换,例如使用XOR

3尝试强制编译器使用寄存器而不是堆栈传递参数,即使x86上存在大量寄存器压力,也值得一试——您可以在MS的编译器上使用标准寄存器关键字或使用fastcall

typedef double** TwoDimArray;

class Solver
{
  inline void Swap( register TwoDimArray& a, register TwoDimArray& b )
  {
    a ^= b ^= a ^= b;
  }
};

4不要为vswap这样的临时程序提供默认值。

您确定您分析了完全优化的代码吗

你应该把他的职责包括在内

除此之外,我看到的唯一一件事是,首先将NULL赋值给vswap,然后立即赋值给其他值——但这应该由优化器处理

 inline void Solver::Swap(double** &v1, double** &v2)
 {
   double** vswap = v2;
   v2 = v1;
   v1 = vswap;
 }

但是,为什么不使用std::swap呢

您确定分析了完全优化的代码吗

你应该把他的职责包括在内

除此之外,我看到的唯一一件事是,首先将NULL赋值给vswap,然后立即赋值给其他值——但这应该由优化器处理

 inline void Solver::Swap(double** &v1, double** &v2)
 {
   double** vswap = v2;
   v2 = v1;
   v1 = vswap;
 }

但是,为什么不使用std::swap呢

不要认为7%意味着这个操作很慢,这取决于其他的情况


你只需要1纳秒的时间就可以完成一个操作,而不需要做任何其他事情,就可以让它花费几乎100%的时间。

不要认为7%意味着这个操作很慢,这取决于其他操作


您只需要1纳秒的时间就可以完成一个操作,并且只需执行几乎100%的时间,只需执行其他操作。

每次迭代都会调用一次,以交换新阵列和旧阵列。阵列本身为2x20000。数组的大小会成为一个问题吗?每次迭代都会调用一次,以交换新的和旧的数组。阵列本身为2x20000。阵列的大小可能是个问题吗?阵列都很大,而且交换量很大。它正在我正在研究的RK4方法中使用。令我烦恼的是,掉期的成本高于衍生品评估。衍生品的计算次数约为2400万次,而掉期仅为502次,但掉期占21%,衍生品仅占13%。注意,导数相当简单。。。t^3但都是一样的。这也可能是因为你的交换被内联到了你的运行中,而优化打开了,不是吗?这可能会扭曲数字。阵列都很大,交换很多。它正在我正在研究的RK4方法中使用。令我烦恼的是,掉期的成本高于衍生品评估。衍生品的计算次数约为2400万次,而掉期仅为502次,但掉期占21%,衍生品仅占13%。注意,导数相当简单。。。t^ 3,但所有相同。这也可能是因为你的交换使你的运行优化,你不是,这可能会歪曲数字。在它的类定义中定义的成员函数隐式内联。好的解决方案,但是C++中的标识符不是从2DARRAY开始的。我的错误,我也写过F。
ast:已经更正了。关于类内方法的隐式内联,这是一个风格问题,我喜欢强调内联关键字和虚拟关键字。我不确定a和b来自哪里?如果这种更改使编译速度更快,您的编译设置会有问题;您确定使用的是高优化级别吗?通常,编译器会忽略内联和寄存器,XOR交换不应该比寄存器拷贝快很多;在类定义中定义的成员函数隐式内联。好的解决方案,但是C++中的标识符不是以2DARRAY开头的。我的错误,我写得太快:它被纠正了。关于类内方法的隐式内联,这是一个风格问题,我喜欢强调内联关键字和虚拟关键字。我不确定a和b来自哪里?如果这种更改使编译速度更快,您的编译设置会有问题;您确定使用的是高优化级别吗?通常,编译器会忽略内联和寄存器,XOR交换不应该比寄存器拷贝快很多;内置交换函数有什么问题?我不知道。。。我是C++新手。这两个执行相同。内置交换功能有什么问题吗?我不知道。。。我是C++新手。这两个执行相同。我实际上不知道std::swap。。。糟糕的是,两者的速度是一样的。泰给我指了指std::swapI,其实他不知道std::swap。。。糟糕的是,两者的速度是一样的。谢谢你把我指向std::swap