2013-07-09 28 views
0

我正在寫一個ODE集成器,它在每個步驟評估dy/dx,之後不需要它。似乎只分配空間會更快,只是使用該空間,以便我不花時間分配新的dydx向量。編譯器會優化這個嗎 換句話說,哪一個更好?返回一個向量或傳遞參考

1)

vector<double> dydx(const vector<double>&x) { 
    vector<double> dydx_tmp(x.size()); 
    for(size_t i = 0; i < x.size()/2; ++i) { 
    dydx_tmp[2*i] = -x[2*i+1]; 
    dydx_tmp[2*i+1] = x[2*i]; 
    } 
    return dydx_tmp; 
} 

或 2),其中dydx已經被分配,只是需要更新

void update_dydx(vector<double> & dydx, const vector<double> &x) { 
    for(size_t i = 0; i < x.size()/2; ++i) { 
    dydx[2*i] = -x[2*i+1]; 
    dydx[2*i+1] = x[2*i]; 
    } 
} 

還有的 3)

vector<double> dydx_by_v(vector<double> x) { 
    vector<double> dydx_tmp(x.size()); 
    for(size_t i = 0; i < x.size()/2; ++i) { 
    dydx_tmp[2*i] = -x[2*i+1]; 
    dydx_tmp[2*i+1] = x[2*i]; 
    } 
    return dydx_tmp; 
} 
的情況下

後面http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/但在這種情況下,它不'因爲x的內存稍後用於輸出,所以它不會被編譯器的RVO使用。

+0

你的矢量真的只是兩個浮點數嗎? – delnan

+0

@delnan它的範圍從2到數千,它可以是編譯或運行時參數。該操作在整個向量上。我只是試圖保持它簡單 –

+0

我編輯我的答案以迴應你的編輯 – aryjczyk

回答

0

終極答案,所有的性能相關的問題進行剖析硬件相同(或至少相似的)你的整個應用它會在生產環境中運行,但這裏是我的theorycrafting的仙三:

  • 通過選項3中的值傳遞)沒有任何意義

  • vector dydx_tmp(x.size()); < - 這會導致默認構建(也稱爲調零)您的向量。使用矢量dydx; dydx.reserve(x.size());然後在循環emplace_back()(添加_temp到你的名字是沒用的 - 每個人都可以看到它是本地的)

  • 選項2)涉及輸入參數,這被認爲是不好的風格,並且在選項1中不會有副本) (如你所鏈接的文章中所解釋的),所以1)是最好的選擇

+0

,因爲'x'只有2個元素。它也可以有數千個。我只是把事情簡單化 –

+1

所以你的函數實際上看起來像(i = 0; i aryjczyk

+0

沒有在選項1中的副本),但它仍然需要分配新的空間。選項2不需要那樣做。不會選擇2更快? –