1

我有以下方法可以在 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 }
4

5 回答 5

4

1)确保你的函数是内联的。

2)您可以使用 XOR 代替交换

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

typedef double** TwoDimArray;

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

4) 不要费心为像vswap.

于 2009-10-09T12:15:13.500 回答
3

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

于 2009-10-09T11:48:43.323 回答
1

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

交换时您必须注意的一个问题是一个数组可能在缓存中而另一个不在缓存中(尤其是如果它们很大),因此不断交换指针可能会破坏缓存,但这会表现为一般的慢 -向下。

于 2009-10-09T11:49:17.473 回答
1

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

你应该inline这个功能。

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

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

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

于 2009-10-09T12:18:10.517 回答
0

不要假设 7% 意味着此操作很慢 - 这取决于其他情况。

你可以有一个只需要 1 纳秒的操作,并使其花费几乎 100% 的时间,而无需执行任何其他操作。

于 2010-02-19T15:21:47.550 回答