Golang 逃逸分析

什么是逃逸分析

In compiler optimization, escape analysis is a method for determining the dynamic scope of pointers - where in the program a pointer can be accessed. It is related to pointer analysis and shape analysis.

When a variable (or an object) is allocated in a subroutine, a pointer to the variable can escape to other threads of execution, or to calling subroutines. If an implementation uses tail call optimization (usually required for functional languages), objects may also be seen as escaping to called subroutines. If a language supports first-class continuations (as do Scheme and Standard ML of New Jersey), portions of the call stack may also escape.

If a subroutine allocates an object and returns a pointer to it, the object can be accessed from undetermined places in the program — the pointer has "escaped". Pointers can also escape if they are stored in global variables or other data structures that, in turn, escape the current procedure.

Escape analysis determines all the places where a pointer can be stored and whether the lifetime of the pointer can be proven to be restricted only to the current procedure and/or threa

逃逸分析是一種確定指針動(dòng)態(tài)范圍的方法析砸,可以分析在程序的哪些地方可以訪問(wèn)到指針露懒。它涉及到指針?lè)治龊托螤罘治觥?當(dāng)一個(gè)變量(或?qū)ο?在子程序中被分配時(shí)揩尸,一個(gè)指向變量的指針可能逃逸到其它執(zhí)行線程中,或者去調(diào)用子程序。如果使用尾遞歸優(yōu)化(通常在函數(shù)編程語(yǔ)言中是需要的),對(duì)象也可能逃逸到被調(diào)用的子程序中遭庶。 如果一個(gè)子程序分配一個(gè)對(duì)象并返回一個(gè)該對(duì)象的指針承匣,該對(duì)象可能在程序中的任何一個(gè)地方被訪問(wèn)到——這樣指針就成功“逃逸”了蓖乘。如果指針存儲(chǔ)在全局變量或者其它數(shù)據(jù)結(jié)構(gòu)中,它們也可能發(fā)生逃逸韧骗,這種情況是當(dāng)前程序中的指針逃逸嘉抒。 逃逸分析需要確定指針?biāo)锌梢源鎯?chǔ)的地方,保證指針的生命周期只在當(dāng)前進(jìn)程或線程中袍暴。

逃逸分析的用處(為了性能)

最大的好處應(yīng)該是減少gc的壓力众眨,不逃逸的對(duì)象分配在棧上,當(dāng)函數(shù)返回時(shí)就回收了資源容诬,不需要gc標(biāo)記清除娩梨。
因?yàn)樘右莘治鐾旰罂梢源_定哪些變量可以分配在棧上,棧的分配比堆快览徒,性能好狈定。
同步消除,如果你定義的對(duì)象的方法上有同步鎖习蓬,但在運(yùn)行時(shí)纽什,卻只有一個(gè)線程在訪問(wèn),此時(shí)逃逸分析后的機(jī)器碼躲叼,會(huì)去掉同步鎖運(yùn)行芦缰。

go消除了堆和棧的區(qū)別
go在一定程度消除了堆和棧的區(qū)別,因?yàn)間o在編譯的時(shí)候進(jìn)行逃逸分析枫慷,來(lái)決定一個(gè)對(duì)象放棧上還是放堆上让蕾,不逃逸的對(duì)象放棧上,可能逃逸的放堆上或听。

開(kāi)啟逃逸分析日志

編譯參數(shù)加入 -gcflags '-m -l'

package main

type S struct { 
    M *int
}

func main() { 
    var i int 
    refStruct(i)
}

func refStruct(y int) (z S) {
    z.M = &y
    return z 
}
?  escapeAnalyze go build -gcflags '-m -l' main.go
# command-line-arguments
./main.go:13:11: &y escapes to heap
./main.go:12:16: moved to heap: y
?  escapeAnalyze

日志的輸出表明探孝,y是逃逸了,因?yàn)?z 引用了 y誉裆,y 本身是一個(gè) i 的副本顿颅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市足丢,隨后出現(xiàn)的幾起案子粱腻,更是在濱河造成了極大的恐慌,老刑警劉巖斩跌,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍些,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滔驶,警方通過(guò)查閱死者的電腦和手機(jī)遇革,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)卿闹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)揭糕,“玉大人萝快,你說(shuō)我怎么就攤上這事≈牵” “怎么了揪漩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吏口。 經(jīng)常有香客問(wèn)我奄容,道長(zhǎng),這世上最難降的妖魔是什么产徊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任昂勒,我火速辦了婚禮,結(jié)果婚禮上舟铜,老公的妹妹穿的比我還像新娘戈盈。我一直安慰自己,他們只是感情好谆刨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布塘娶。 她就那樣靜靜地躺著,像睡著了一般痊夭。 火紅的嫁衣襯著肌膚如雪刁岸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天她我,我揣著相機(jī)與錄音虹曙,去河邊找鬼。 笑死番舆,一個(gè)胖子當(dāng)著我的面吹牛根吁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播合蔽,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼击敌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拴事?” 一聲冷哼從身側(cè)響起沃斤,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刃宵,沒(méi)想到半個(gè)月后衡瓶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牲证,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年哮针,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡十厢,死狀恐怖等太,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛮放,我是刑警寧澤缩抡,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站包颁,受9級(jí)特大地震影響瞻想,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娩嚼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一蘑险、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岳悟,春花似錦漠其、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至春瞬,卻和暖如春柴信,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宽气。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工随常, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萄涯。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓绪氛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涝影。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枣察,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容