我假設計算一個數的模數是一個相當昂貴的操作,至少與簡單的算術測試(比如看一個數是否超出數組的長度)相比是一個相當昂貴的操作。如果確實如此,替換例如下面的代碼是否更有效:儘可能避免使用mod運算符更好嗎?
res = array[(i + 1) % len];
以下內容? :
res = array[(i + 1 == len) ? 0 : i + 1];
第一個是對眼睛更容易,但我不知道如果第二可能是更有效的。如果是這樣,我可能希望優化編譯器在使用編譯語言時用第二個代碼片段替換第一個片段?
當然,這種「優化」(如果確實是優化)在所有情況下都不起作用(在這種情況下,只有在i+1
永遠不會超過len
時才起作用)。
這可能是錯過了樹林的情況。 – 2013-03-24 07:58:13
如果'len'是一個編譯時常量,最近的GCC編譯器(帶有'-02')通常會做很聰明的事情,通常會避免目標處理器的模數指令。 – 2013-03-24 07:59:34
這真的是你應該忘記的那種優化。優化編譯器會比你做得更好。更重要的是你的代碼的可讀性。 – 2013-03-24 08:04:47