我有以下方法在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 }
答案 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%的时间都可以完成。