翻譯原文連接 轉帖/轉載請註明出處算法
英文原文連接 發表於2014/06/07安全
Go語言由於強制的內存垃圾回收機制變得更加簡單和安全。但這並不意味着垃圾回收機制把Go程序變慢了,或者說垃圾回收機制最終決定了你程序的速度。不能否認,在堆(heap)上分配內存是有代價的。每次垃圾回收機制觸發都會消耗必定的CPU。除非內存都被釋放了,這些開銷是不可避免的。函數
可是還有另一個地方咱們能夠用來分配內存。那就是棧(stack)。post
與C語言不一樣,Go語言不須要你選擇一個變量是分配在堆上(經過malloc),仍是棧上(經過將這個變量定義成函數內的局部變量)。Go語言實現了一個叫作逃逸分析(Escape Analysis)的優化技術。優化
逃逸分析可以判斷是否有任何對函數局部變量的引用在此函數以外也被用到了。若是沒有引用在函數以外被用到,那麼這個局部變量就能夠安全地存儲在棧上。在棧上存儲的變量不須要特別的分配和釋放操做。讓咱們來看看下面這個例子:spa
Sum函數把1到100之間的數字相加並返回結果。咱們一般不會這麼來寫這個函數,只是用它來展現逃逸分析算法。.net
由於numbers變量只在Sum函數裏被引用,編譯器會將這100整數存儲在棧上而不是堆上。因此也就不須要去垃圾回收numbers變量,它會在Sum函數返回的時候自動被釋放掉。翻譯
上面顯示的第二個例子也是爲了闡述一樣的問題而創造出來的。在CenterCursor函數裏,咱們建立了一個新的Cursor結構而且把它的指針保存在變量c裏。而後咱們將變量c傳入Center()函數。Center()函數將Cursor結構平移半個屏幕的距離。最後把Cursor結構的X和Y的座標打印出來。雖然變量c是經過new函數分配的,它不會被存儲在堆上。這是由於變量c的引用並無在CenterCursor函數以外被用到。指針
Go語言的優化在缺省設置下老是被打開的。你能夠用-gcflags=-m參數來查看編譯器的逃逸分析和內聯決定。code
逃逸分析是在編譯時而不是運行的時候作的。不管垃圾回收機制多麼高效,棧的分配老是比堆的分配要快。接下來,我還會討論到棧。