go的臨時對象池--sync.Pool

一個sync.Pool對象就是一組臨時對象的集合通熄。Pool是協(xié)程安全的更耻。
Pool用于存儲那些被分配了但是沒有被使用,而未來可能會使用的值罚渐,以減小垃圾回收的壓力却汉。一個比較好的例子是fmt包,fmt包總是需要使用一些[]byte之類的對象荷并,golang建立了一個臨時對象池合砂,存放著這些對象,如果需要使用一個[]byte璧坟,就去Pool里面拿既穆,如果拿不到就分配一份。
這比起不停生成新的[]byte雀鹃,用完了再等待gc回收來要高效得多幻工。

type buffer []byte
// pp是用于存儲printer狀態(tài)的一個結(jié)構(gòu)體
type pp struct {
    buf buffer
    arg interface{}
    value reflect.Value
    fmt fmt
    reordered bool
    goodArgNum bool
    panicking bool
    erroring bool
}
//一個pp的對象池
var ppFree = sync.Pool{
    New: func() interface{} { return new(pp) },
}
// 分配一個新的pp或者拿一個緩存的。
func newPrinter() *pp {
    p := ppFree.Get().(*pp)
    p.panicking = false
    p.erroring = false
    p.fmt.init(&p.buf)
    return p
}

sync.Pool有兩個公開的方法黎茎。一個是Get囊颅,另一個是Put。前者的功能是從池中獲取一個interface{}類型的值傅瞻,而后者的作用則是把一個interface{}類型的值放置于池中踢代。

最簡單的例子

// 一個[]byte的對象池,每個對象為一個[]byte
var bytePool = sync.Pool{
  New: func() interface{} {
    b := make([]byte, 1024)
    return &b
  },
}

func main() {
  a := time.Now().Unix()
  // 不使用對象池
  for i := 0; i < 1000000000; i++{
    obj := make([]byte,1024)
    _ = obj
  }
  b := time.Now().Unix()
  // 使用對象池
  for i := 0; i < 1000000000; i++{
    obj := bytePool.Get().(*[]byte)
    _ = obj
    bytePool.Put(obj)
  }
  c := time.Now().Unix()
  fmt.Println("without pool ", b - a, "s")
  fmt.Println("with    pool ", c - b, "s")
}

// without pool  34 s
// with    pool  24 s

上面代碼的運行結(jié)果顯示使用對象池很明顯提升了性能

擴展閱讀

墻裂推薦
golang內(nèi)存回收
bytepool

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗅骄,一起剝皮案震驚了整個濱河市胳挎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溺森,老刑警劉巖慕爬,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屏积,居然都是意外死亡医窿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門炊林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥卢,“玉大人,你說我怎么就攤上這事《懒瘢” “怎么了僧叉?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棺榔。 經(jīng)常有香客問我彪标,道長,這世上最難降的妖魔是什么掷豺? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任捞烟,我火速辦了婚禮,結(jié)果婚禮上当船,老公的妹妹穿的比我還像新娘题画。我一直安慰自己,他們只是感情好德频,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布苍息。 她就那樣靜靜地躺著,像睡著了一般壹置。 火紅的嫁衣襯著肌膚如雪竞思。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天钞护,我揣著相機與錄音盖喷,去河邊找鬼。 笑死难咕,一個胖子當著我的面吹牛课梳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播余佃,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼暮刃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爆土?” 一聲冷哼從身側(cè)響起椭懊,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎步势,沒想到半個月后氧猬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡立润,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年狂窑,在試婚紗的時候發(fā)現(xiàn)自己被綠了媳板。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桑腮。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛉幸,靈堂內(nèi)的尸體忽然破棺而出破讨,到底是詐尸還是另有隱情丛晦,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布提陶,位于F島的核電站烫沙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隙笆。R本人自食惡果不足惜锌蓄,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撑柔。 院中可真熱鬧瘸爽,春花似錦、人聲如沸铅忿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檀训。三九已至柑潦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間峻凫,已是汗流浹背渗鬼。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荧琼,地道東北人乍钻。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像铭腕,于是被迫代替她去往敵國和親银择。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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

  • 01.{ 換行: Opening Brace Can't Be Placed on a Separate Lin...
    碼農(nóng)不器閱讀 2,404評論 0 14
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理累舷,服務(wù)發(fā)現(xiàn)浩考,斷路器,智...
    卡卡羅2017閱讀 134,696評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法被盈,類相關(guān)的語法析孽,內(nèi)部類的語法,繼承相關(guān)的語法只怎,異常的語法袜瞬,線程的語...
    子非魚_t_閱讀 31,661評論 18 399
  • Java對象的生命周期分析 Java對象的生命周期大致包括三個階段: 對象的創(chuàng)建 對象的使用 對象的清 因此,對象...
    jiangmo閱讀 3,497評論 1 3
  • fmt格式化字符串 格式:%[旗標][寬度][.精度][arg索引]動詞旗標有以下幾種:+: 對于數(shù)值類型總是輸出...
    皮皮v閱讀 1,099評論 0 3