Go 1.1 效能提升 —— 第3部分

類別: IT

本文是對最近推出的Go 1.1中效能提升進行探究的一系列文章中的最後一篇, 你也可以讀一下第一部分第二部分,瞭解有關在amd64和386這兩方面的資訊。

本文著重介紹arm平臺的效能。Go 1.1是個比較重要的版本,因為它將arm提升到了與amd64和386同等重要的文章,並引入了對另外的作業系統的支援。Go 1.1為arm帶來的一些亮點包括:

  • 對forcgo的支援。
  • 新增了對freebsd/arm和netbsd/arm實驗性的支援。
  • 程式碼產生的更好了,包括現在已部分實現的窺孔優化器、更好的暫存器分配器並在減小程式碼總量上有許多小改進。
  • 支援ARM v6的主機,包括Raspberry Pi。
  • 現在GOARM變數變成了可選項了,並且它會根據它是在哪種主機上編譯的而自動選擇其值。
  • 消除了許多以前要化很大代價來模擬執行的64位指令,記憶體分配器的執行速度得到了顯著提升
  • 速度更快的用軟體實現的求商/求餘工具

這些改進要是沒有Shenghou Ma、Rémy Oudompheng以及Daniel Morsing的努力是不可能實現的,他們三位在Go 1.1的這個開發週期內,為該編譯器和執行時環境做出了巨大的貢獻。

還有,我不得不重重的感謝一下Anthony Starks,他幫著為這篇文章準備了基準測試資料以及所有的圖片。

Go 1在linux/arm之上的基準測試

自Go釋出之日起,它就支援了多種arm架構。 這裡給出的是來自多個主機的基準測試,能夠代表出Go 1.1程式在arm主機上的效能。從左上角到右下角分別是

和以前一些,這裡給出的結果也可從autobench庫中獲得,點選略圖可以看到全解析度的大圖。

baseline-grid

BinaryTree17上獲得的加速而在Fannkuch11上略遜一籌,這是受了堆分配器的效能的影響。堆分配部分地涉及到了對儲存為64位的量的統計資料的更新,這部分流向了runtime.MemStats。在1.1的開發週期中對原子符號部分進行了一些快速處理,移除了大部分的這些64位的運算,這從基準測試中執行時間的減少就能看出來。

net/http

在所有的樣例中,net/http的基準測試同時受益於新的輪詢器實現和純net/http軟體包在純Go語言方面的改進,這兩部分的工作是由 Brad Fitzpatrick和Jeff Allen來完成的。

net-grid

runtime

runtime基準測試的結果同amd64和386上的完全一致。總體的趨勢都是有所改進,在有些情況下提升巨大,比如在map運算方面提升就不小。

runtime-grid

Append部分的基準測試有所提升受益於由Rob Pike提交的一個修改,該修改避免了在向[]byte新增少量資料時對runtime.memmove的呼叫。

在所有的資料中都可以看出,channel操作方面有所退化。這可能是由於在arm平臺上完成原子性操作的代價比較高。目前所有原子性操作都是在runtime中實現的,但以後可能會由編譯器來直接處理,這樣就能減少這部分開銷了。

CompareString的基準測試表明同其它的相比它的提升較小,這是因為CL 8056043還沒有完全移植到arm平臺中呢。

結束語

增加了cgo的支援, net軟體包的吞吐量有所提升,程式碼生成和記憶體垃圾回收器方面也有改進,Go 1.1代表著在arm平臺上編寫Go程式的一個重要里程碑。

總結本系列的三篇文章起來講,非常明顯,在Go所支援的三個架構下,Go 1.1總體上提供了原先承諾的30-40%的改進。如果我們考慮上編譯器方面相對的改進,儘管6g仍為旗艦編譯器,也從最快速的底層硬體中獲益頗多,但同去年的1.0相比,8g和5g的改進非常大。

等一下,還沒完呢

如果你讀完了這個系列的文章,並且還想繼續跟蹤Go 1.2的進展, 我們馬上就要新開一個autobench的分支,用來跟蹤Go 1.1和tip (1.2)的對比情況。弄好之後我會發布博文和推文。

Go 1.2的更改視窗於5月14號就開始了,分配器和記憶體垃圾回收器已經接收到了來自Dmitry Vyukov的改進,Atom符號也有針對性的在進一步減少GC的代價,還有Carl Shapiro也已經開始同精確收集在棧裡分配的值相關的工作。

針對Go 1.2,還有幾個建議,一個是需要一個更好的記憶體分配器,還有一個是要對排程器進行修改,讓它具有能夠搶佔長時間執行的goroutines的能力,其目標在於減小GC的延遲。

最後要說的是,Go 1.2有一個釋出時間表。所以,儘管我們說不準到底會有哪些特效能夠或者不能包含進1.2中,但是我們能夠說的準的是,1.2應該會在2013年底完成。

Go 1.1 效能提升 —— 第3部分原文請看這裡