2012-01-13 24 views
2

我有一種情況,我可能可能需要應用乘數到一個值,以獲得正確的結果。這涉及使用浮點除法來計算值。浮點除法和檢查值的效率如果公式

我想這是一個好主意,在我對它們執行浮點邏輯以節省處理器時間之前檢查這些值,但是我不確定它在運行時的效率如何。

我假設if檢查是1或2條指令(自從彙編類以來已經有一段時間了),並且浮點運算將比這更多。

//Check 
if (a != 10) {    //1 or 2 instructions? 
    b *= (float) a/10; //Many instructions? 
} 

價值a將是「10」的大部分時間,但也有少數情況下,它不會是。即使a等於除數,浮點除法將花費很多週期嗎?

以前的代碼與if語句執行更有效率比沒有下一個更簡單?

//Don't check 
b *= (float) a/10; //Many instructions? 

就算有不會是任何noticable差異無論哪種方式,不過我很好奇,浮點乘法的行爲時,除數等於分紅的情況下,事情就變得處理器沉重。

+0

您是否試過microbenchmarking兩個版本? – millimoose 2012-01-13 20:40:01

+0

不,我還會更新我的問題 – styler1972 2012-01-13 20:43:01

+2

是的,首先是基準,以確定它是否重要;如果沒有,做最簡單的事情。這就是說:分支小姐比分部更昂貴,所以除非分支具有高度可預測性,否則檢查不值得。 – comingstorm 2012-01-13 22:08:55

回答

5

假設這是一些令人難以置信的緊張循環,執行數十億倍,因此1-2的說明事項的差異,否則你可能不應該打擾 -

是的,你是正確的權衡成本每次額外檢查一次,而檢查結果爲真時節省一次。但我的猜測是,它必須是真實的,不僅要克服額外的開銷,而且要引入一個分支,最終將通過JIT中的CPU中的管線停滯來降低速度。編譯的代碼比你會獲得的其他方式。

如果a == 10有很多,我會想象有一種更好更快的方法可以在代碼的早期以某種方式利用它。

+0

+1用於將支票重新分解爲代碼較少被販賣的區域 – styler1972 2012-01-13 22:22:33

3

IIRC,浮點乘法是遠遠超過分工更便宜,所以這可能是比速度更快:

b *= (a * 0.1); 
+2

如果您可以承認事實並非如此,那麼這個分區與10分區不完全相同。 – Voo 2012-01-14 00:32:51

1

如果最終需要優化這個代碼,我會建議使用卡尺做微內循環的基準。要準確預測這些小修改會產生什麼樣的影響是非常困難的。特別是在Java中,虛擬機的行爲方式有點未知,因爲理論上它可以實時優化代碼。最好嘗試幾種策略,看看有什麼作用。

http://code.google.com/p/caliper/