我現在開始使用dsp編程,並正在編寫我的第一個低級類和函數。 因爲我想要的功能是快速的(或最終不是低效的),我經常想知道我應該使用什麼,我應該避免在函數中調用每個樣本。DSP性能,應該避免什麼?
我知道指令的速度差異很大,但我認爲你們中的一些人至少可以分享經驗法則或經驗。 :)
條件語句
如果我不得不使用條件,switch
應該比一個if/else if
塊更快,對不對? 使用兩個if
-statements或if-else
之間是否存在差異?在某處我讀else
應該避免,但我不知道爲什麼。
此外,與乘法相比,if-block需要多少時間纔會有粗魯估計?因爲在某些情況下,使用乘法零可以用來代替if語句:
//something could be an int either 1 or 0:
if(something) {
signal += something_else;
}
// or:
signa+ += something*something_else;
函數和函數指針
而不是使用條件語句,你可以使用函數指針。而不是在每次調用中使用條件,指針可以被重定向到一個特定的函數。但是,對於每次調用,必須解釋指針才能調用正確的函數。所以我不知道這是否會有所幫助。
我還在想,如果調用函數有影響。如果是這樣,應該避免拳擊功能,對吧?
變量
我會認爲,定義和功能使用許多變量並不真的產生影響,至少相對於計算。這是真的?否則,重複使用聲明的變量會比更多的聲明更好。
計算 是否有計算類型的順序執行時間?我相信這在很大程度上取決於背景,但經驗法則會很好。我經常會讀到,人們只算算算法中的乘法。這是因爲添加速度非常快嗎? 它在乘法和除法之間有區別嗎? (*0.5
或/2.0
)
我希望你能分享soem的經驗。
乾杯
先實施,再優化。也就是說,除非你有工作代碼,否則不要擔心性能。然後分析您的工作代碼並優化瓶頸。 – dohashi 2014-09-03 13:33:49
現在有了複雜的優化編譯器,回答這個問題的唯一方法就是告訴你簡介。一個編譯器通常「知道」如果可以將浮點運算部分轉換爲乘法運算,並且在現代CPU上使用分支預測等,則很難以一般而有用的方式回答您的問題。 – 2014-09-03 13:34:30
就像我說過的,我不會從算法中擠出納秒,但是對於設計類和函數,一些基本規則會幫助你。 :) – 2014-09-03 13:36:23