2017-08-03 89 views
2

如果我有一些簡單的算術重複幾次的代碼。編譯器會自動優化它嗎?編譯器會自動優化重複代碼嗎?

在這裏,例如:

someArray[index + 1] = 5; 
otherArray[index + 1] = 7; 

是否有意義,以從視性能比較點引入可變nextIndex = index + 1,(不是從視圖的良好可讀和maintanable代碼的點)或編譯器將做這樣自動優化?

+0

那麼,如果索引是一個基本的整數類型,很可能它將啓用優化。 – StoryTeller

+4

爲什麼不啓用優化來構建,並檢查生成的代碼? –

+1

編譯它並檢查程序集。可以想象它可能但我很懷疑。 – NathanOliver

回答

2

你不應該擔心這樣的微不足道的優化,因爲幾乎所有的編譯器都會使用10-15年或更長的時間。

但是,如果你在代碼中有一個非常重要的地方,並希望得到運行最大速度,比你可以爲這個線檢查生成的彙編代碼,以確保編譯器做這個簡單的優化。

在某些情況下多了一個算術加法可能是代碼比寄存器或存儲器中保存更多更快的版本,和編譯器知道這一點。如果您嘗試手動優化瑣事,您可以使代碼更慢。

你可以(在多個版本的支持GCC,鐺,ICC)使用的在線服務,如https://gcc.godbolt.org進行檢查生成的代碼。

1

古老的諺語「吮吸並看」在這裏似乎是適當的。我們經常會忘記,迄今爲止最常見的處理器是4/8/16位微處理器,具有奇怪而精彩的特定應用架構,適合奇怪的供應商特定編譯器。他們經常使用編譯器擴展來「幫助」(或混淆)編譯器生成「更好」的代碼。從2000年代早期

一個DSP在一個管道中進行每時鐘週期8個指令並行(複雜 - 「負載+增量+相乘+添加+圓」)。這項工作的先決條件是,事先必須預先將所有內容預先加載到寄存器中。這意味着寄存器顯然很貴(一如既往)。有了這種架構,將結果存入空閒寄存器並使用無法並行的空閒插槽(某些指令阻止在同一週期內使用其他插槽)以後重新計算時,通常會更好。編譯器是否得到這個「正確」?是的,它經常保持結果以後重用,結果是由於缺少導致執行速度較慢的寄存器而導致流水線停頓。

所以,你編譯它,它檢查,異型它等,以確保該時當編譯器得到它「正確」的,我們可以去解決它。如果沒有語言不支持的額外語義信息,真的很難知道「正確」是什麼。

結論:吸了,看看