慢如果乘法比加法,而不是做優化乘法比另外
7 * 8
請問這種理論上提高性能慢?
for(int i =0; i < 8 ; i++){
temp += 7
}
要不然我只需要做
7 + 7 + 7 + 7 + 7 + 7 + 7 + 7
慢如果乘法比加法,而不是做優化乘法比另外
7 * 8
請問這種理論上提高性能慢?
for(int i =0; i < 8 ; i++){
temp += 7
}
要不然我只需要做
7 + 7 + 7 + 7 + 7 + 7 + 7 + 7
你已經嘗試過了,並定時呢?
在幾乎每一臺現代機器上,都有對乘法的快速硬件支持。所以除非它簡單乘以2,否,它不會更快。
要查看關於當前Intel機器一些硬號碼:
add/sub 1 cycle latency
mul/imul 3 cycle latency
雖然它實際上比這更復雜,但重點仍然是:不,你不會試圖用加法代替乘法。
在少數情況下,它是更好(如由二的冪的乘法 - 使用移動),編譯器會做出優化你,如果它知道在編譯時的值。
在x86上,該編譯器還可以與lea
指令玩到了3,5,10,等做快速乘法......
是的,編譯器將無論如何產生的最佳代碼。 Afaik有幾個CPU,編譯器會用'a + a'代替'a * 2',而不是'a >> 1',所以這裏有一些事實。但是,這顯然是一個特殊情況 - 看到所有人寫'a >> 1'來「優化」他們的代碼仍然很有趣。 – Voo 2011-12-28 23:37:01
@Voo我認爲在所有我現在看到的情況下,編譯器實際上並不是'a >> 1'而是'a + a'。這是有道理的,因爲在過去幾年裏,加/減操作得到了很大程度的優化,以至於它們的吞吐量往往比換檔更高。 – Mysticial 2011-12-28 23:41:41
哎呀,我們兩個人的意思是說'a << 1'而不是'a >> 1' ... – Mysticial 2011-12-28 23:53:37
我覺得很難相信,16間值分配,16種添加和8個條件語句比處理器可以乘以7 * 8更快。
,如果你乘以2則移位... – 2011-12-28 23:19:25
我使用了7 * 8,這樣我就可以很容易地寫出問題了。如果8類似15111那麼該怎麼辦?那麼你肯定會看到我的情況有些滯後。 – klijo 2011-12-28 23:25:19
您會在for循環中看到比在一個乘法語句中更高的延遲。現代處理器將以7 * 15111乘以相同速度乘以7 * 8。 for循環正在訪問內存,並且多次在寄存器中移動內容以提高效率。 – 2011-12-28 23:30:04
在哪些情況下,哪些硬件乘法比加法慢?大多數合理的現代處理器都有內置的乘法指令,這些指令接近於快速加法。 – 2011-12-28 23:14:11
任何語言/平臺? – cnicutar 2011-12-28 23:14:19
我的意思是假設乘法比加法慢,那麼我應該如何改進呢? – klijo 2011-12-28 23:16:23