先簡單小結一下:
當編譯器最佳化能力很弱時,用移位代替簡單除法(除2,4,8,16...)效率更高;
當編譯器最佳化能力很弱時,在低端CPU上,用移位代替簡單乘法(乘2,4,8,16...)效率更高
其它情況下,在C語言程式中,用移位操作代替乘除運算沒什麼效果,反而降低了程式碼的可讀性
下面簡單說一下各種情況:
現代C編譯器對於簡單的2,4,8之類的乘除法,會在最佳化時根據條件自動轉換成移位運算。這時,沒有必要手動使用移位運算子代替乘除,相信編譯器的最佳化能力就好了。有時候為了更好的適配目標CPU,可以給編譯器提供詳細引數,如ARM C編譯器可指定乘法指令所需週期數,這就方便編譯器針對特定CPU進行最佳化。
當編譯器不能進行自動移位最佳化時,對於簡單除法,使用移位操作代替會有一定效果:由於除法的演算法特性,RISC CPU(如ARM系列絕大多數CPU)都沒有完整的整數除法指令,這是基於除法特殊性造成的。如果用浮點數除法模擬,則結果未必正確,同時起碼需要十幾個時鐘週期才能完成。這時,如果能用兩三次移位操作和加法組合完成除法,當然會有效率的提高。
再說說CPU的影響:
這裡提到的低端CPU,指的是沒有硬體乘法器、也沒有浮點協處理器的CPU。這類CPU的乘法需要用加法模擬,因此速度較慢。此時,用移位操作代替簡單的乘法能提高效率。
低端CPU舉例:無MAC單元的ARM Cortex-M系列CPU,AVR的Atmega等各8位MCU。
中高階CPU通常都有乘法器和浮點協處理器。對於這類CPU,用移位代替乘法意義不大,也許能在CPU指令發射時降低流水線阻塞(這是由於多發射高階CPU的移位處理單元數量多於乘法器數量),從而提高微量的效能,但總體影響微乎其微。
先簡單小結一下:
當編譯器最佳化能力很弱時,用移位代替簡單除法(除2,4,8,16...)效率更高;
當編譯器最佳化能力很弱時,在低端CPU上,用移位代替簡單乘法(乘2,4,8,16...)效率更高
其它情況下,在C語言程式中,用移位操作代替乘除運算沒什麼效果,反而降低了程式碼的可讀性
下面簡單說一下各種情況:
編譯器因素現代C編譯器對於簡單的2,4,8之類的乘除法,會在最佳化時根據條件自動轉換成移位運算。這時,沒有必要手動使用移位運算子代替乘除,相信編譯器的最佳化能力就好了。有時候為了更好的適配目標CPU,可以給編譯器提供詳細引數,如ARM C編譯器可指定乘法指令所需週期數,這就方便編譯器針對特定CPU進行最佳化。
除法當編譯器不能進行自動移位最佳化時,對於簡單除法,使用移位操作代替會有一定效果:由於除法的演算法特性,RISC CPU(如ARM系列絕大多數CPU)都沒有完整的整數除法指令,這是基於除法特殊性造成的。如果用浮點數除法模擬,則結果未必正確,同時起碼需要十幾個時鐘週期才能完成。這時,如果能用兩三次移位操作和加法組合完成除法,當然會有效率的提高。
再說說CPU的影響:
低端CPU這裡提到的低端CPU,指的是沒有硬體乘法器、也沒有浮點協處理器的CPU。這類CPU的乘法需要用加法模擬,因此速度較慢。此時,用移位操作代替簡單的乘法能提高效率。
低端CPU舉例:無MAC單元的ARM Cortex-M系列CPU,AVR的Atmega等各8位MCU。
中高階CPU中高階CPU通常都有乘法器和浮點協處理器。對於這類CPU,用移位代替乘法意義不大,也許能在CPU指令發射時降低流水線阻塞(這是由於多發射高階CPU的移位處理單元數量多於乘法器數量),從而提高微量的效能,但總體影響微乎其微。