短版本
在下面的行:處理器是否真的計算乘以零或一個?爲什麼?
aData[i] = aData[i] + (aOn * sin(i));
如果aOn
是0
或1
,莫非處理器實際執行乘法,或者它有條件地計算出的結果(0
爲0
,其他價值爲1
)?
長版本
我尋找到算法性能一致性,這部分包括進去一看的Branch Prediction效果。
的假設是,這樣的代碼:
for (i = 0; i < iNumSamples; i++)
aData[i] = aData[i] + (aOn * sin(i));
將提供比此碼(其中,分支預測可能破壞性能)更穩定的性能:
for (i = 0; i < iNumSamples; i++)
{
if (aOn)
aData[i] = aData[i] + sin(i);
}
與aOn
是要麼0
或1
,並且可以在另一個線程的循環執行期間切換。
實際條件的計算(+ sin(i)
在上面的例子中)涉及更多的處理和如果條件必須是在循環中(有大量的情況下,不只是一個象在上面的例子;另外,改變aOn
應具有立即生效,而不是每循環)。
忽略性能一致性,這兩個選項之間的性能權衡是在執行if
語句和乘法語句所花費的時間。無論如何,很容易發現,如果處理器不會像1
和0
這樣的值執行實際乘法運算,那麼第一個選項可能是雙贏的解決方案(無分支預測,性能更好)。
這可能是因爲編譯器會優化這些了。 – iamnotmaynard
我檢查了是否進行了優化,它對'0','1'和其他任何數字的乘法器之間的相對性能沒有任何影響(儘管對於所有情況,優化都略微提高了性能)。那麼究竟優化與處理器是否執行乘法有關? – Izhaki
@iamnotmaynard編譯器不能優化它,除非aOn是一個常量,但OP沒有給出任何指示。 –