用c ++交换2D双精度数组

时间:2009-10-09 11:46:17

标签: c++ g++ gprof

我有以下方法在c ++中交换两个双数组(double **)。分析代码,该方法占运行时的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 }

5 个答案:

答案 0 :(得分:4)

1)确保您的功能已内联。

2)您可以使用XOR实例进行交换

3)尝试强制编译器使用寄存器而不是堆栈传递参数(即使x86上存在大量的寄存器压力,值得尝试) - 您可以使用标准register关键字或者使用{ MS'编译器上的{1}}。

fastcall

4)不要为typedef double** TwoDimArray; class Solver { inline void Swap( register TwoDimArray& a, register TwoDimArray& b ) { a ^= b ^= a ^= b; } }; 等临时值提供默认值。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

交换时必须注意的一个问题是,一个数组可能位于缓存中而另一个数据不存在(特别是如果它们很大),因此不断交换指针可能会丢弃缓存,但这会显示为一般放慢速度。

答案 3 :(得分:1)

您确定自定义了完全优化的代码吗?

你应该inline这个功能。

除此之外,我唯一看到的是你首先将NULL分配给vswap,然后立即分配一些其他值 - 但这应该由优化器处理。

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

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

答案 4 :(得分:0)

不要假设7%表示此操作很慢 - 这取决于 else 正在进行的操作。

你可以进行只需1纳秒的操作,并且几乎100%的时间都可以完成。