<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go - 基于逃逸分析來提升程序性能

          共 1854字,需瀏覽 4分鐘

           ·

          2021-10-25 21:52

          文章目錄:

          • 前言

          • 什么是逃逸分析?

          • 如何確定是否逃逸?

          • 可能出現(xiàn)逃逸的場(chǎng)景

            • 01

            • 02

            • 03

          • 小結(jié)

          • 推薦閱讀

          前言

          為什么需要了解逃逸分析?

          因?yàn)槲覀兿胍嵘绦蛐阅埽ㄟ^逃逸分析我們能夠知道變量是分配到堆上還是棧上,如果分配到棧上,內(nèi)存的分配和釋放都是由編譯器進(jìn)行管理,分配和釋放的速度非常快,如果分配到堆上,堆不像棧那樣可以自動(dòng)清理,它會(huì)引起頻繁地進(jìn)行垃圾回收(GC),而垃圾回收會(huì)占用比較大的系統(tǒng)開銷。

          什么是逃逸分析?

          在編譯程序優(yōu)化理論中,逃逸分析是一種確定指針動(dòng)態(tài)范圍的方法,簡單來說就是分析在程序的哪些地方可以訪問到該指針。

          簡單的說,它是在對(duì)變量放到堆上還是棧上進(jìn)行分析,該分析在編譯階段完成。如果一個(gè)變量超過了函數(shù)調(diào)用的生命周期,也就是這個(gè)變量在函數(shù)外部存在引用,編譯器會(huì)把這個(gè)變量分配到堆上,這時(shí)我們就說這個(gè)變量發(fā)生逃逸了。

          如何確定是否逃逸?

          go?run?-gcflags?'-m?-l'?main.go

          可能出現(xiàn)逃逸的場(chǎng)景

          01

          package?main

          type?Student?struct?{
          ?Name?interface{}
          }

          func?main()??{
          ?stu?:=?new(Student)
          ?stu.Name?=?"tom"

          }

          分析結(jié)果:

          go?run?-gcflags?'-m?-l'?01.go
          #?command-line-arguments
          ./01.go:8:12:?new(Student)?does?not?escape
          ./01.go:9:11:?"tom"?escapes?to?heap

          interface{} 賦值,會(huì)發(fā)生逃逸,優(yōu)化方案是將類型設(shè)置為固定類型,例如:string

          package?main

          type?Student?struct?{
          ?Name?string
          }

          func?main()??{
          ?stu?:=?new(Student)
          ?stu.Name?=?"tom"

          }

          分析結(jié)果:

          go?run?-gcflags?'-m?-l'?01.go
          #?command-line-arguments
          ./01.go:8:12:?new(Student)?does?not?escape

          02

          package?main

          type?Student?struct?{
          ?Name?string
          }

          func?GetStudent()?*Student?{
          ?stu?:=?new(Student)
          ?stu.Name?=?"tom"
          ?return?stu
          }

          func?main()?{
          ?GetStudent()
          }

          分析結(jié)果:

          go?run?-gcflags?'-m?-l'?02.go
          #?command-line-arguments
          ./02.go:8:12:?new(Student)?escapes?to?heap

          返回指針類型,會(huì)發(fā)生逃逸,優(yōu)化方案視情況而定。

          函數(shù)傳遞指針和傳值哪個(gè)效率高嗎?我們知道傳遞指針可以減少底層值的拷貝,可以提高效率,但是如果拷貝的數(shù)據(jù)量小,由于指針傳遞會(huì)產(chǎn)生逃逸,可能會(huì)使用堆,也可能會(huì)增加 GC 的負(fù)擔(dān),所以傳遞指針不一定是高效的。

          不要盲目使用變量指針作為參數(shù),雖然減少了復(fù)制,但變量逃逸的開銷可能更大。

          03

          package?main

          func?main()?{
          ?nums?:=?make([]int,?10000,?10000)

          ?for?i?:=?range?nums?{
          ??nums[i]?=?i
          ?}
          }

          分析結(jié)果:

          go?run?-gcflags?'-m?-l'?03.go
          #?command-line-arguments
          ./03.go:4:14:?make([]int,?10000,?10000)?escapes?to?heap

          棧空間不足,會(huì)發(fā)生逃逸,優(yōu)化方案盡量設(shè)置容量,如果容量實(shí)在過大那就沒辦法了。

          小結(jié)

          1. 逃逸分析是編譯器在靜態(tài)編譯時(shí)完成的。
          2. 逃逸分析后可以確定哪些變量可以分配在棧上,棧的性能好。

          以上,希望對(duì)你能夠有所幫助。



          推薦閱讀


          福利

          我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲取;還可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉国产在线观看 | 1234精品视频在线观看 | 亚洲欧美性爱视频 | 一级A片亲子乱 | 国产精品五月天 |