[英]Swap 2D Double Arrays in c++
我有以下方法在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 }
1)確保內聯函數。
2)您可以就位交換,例如使用XOR
3)嘗試強制編譯器使用寄存器而不是堆棧來傳遞參數(即使x86上的寄存器壓力很大,也值得嘗試)-您可以使用標准的register
關鍵字或在MS編譯器上使用fastcall
。
typedef double** TwoDimArray;
class Solver
{
inline void Swap( register TwoDimArray& a, register TwoDimArray& b )
{
a ^= b ^= a ^= b;
}
};
4)不要為vswap
臨時vswap
提供默認值。
代碼看起來不錯。 它只是一個指針分配。 這取決於調用該方法的次數。
我猜您的探查器在這里有點困惑,因為此方法實際上只交換兩個指針,這非常便宜。 除非調用此方法很多 ,否則它不應顯示在配置文件中。 您的探查器是否告訴您此方法被調用的頻率?
交換時您必須了解的一個問題是,一個數組可能位於緩存中,而另一個數組則不在(尤其是如果它們很大),因此不斷交換指針可能會破壞緩存,但是這會以一般的慢速方式顯示-下。
您確定配置了完全優化的代碼嗎?
您應該inline
此函數。
除此之外,我看到的唯一一件事是,您首先將NULL
分配給vswap
然后立即分配一些其他值-但這應該由優化程序來處理。
inline void Solver::Swap(double** &v1, double** &v2)
{
double** vswap = v2;
v2 = v1;
v1 = vswap;
}
但是,為什么不使用std::swap()
呢?
不要假設7%表示這種操作很慢-這取決於其他人是怎么回事。
您可以執行一項僅需1納秒的操作,而無需執行其他任何操作即可使其花費近100%的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.