欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言學(xué)習(xí)技巧之如何合理使用Pool

 更新時(shí)間:2017年12月14日 09:06:14   作者:Zachary Marv  
這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)技巧之如何合理使用Pool的相關(guān)資料,Pool用于存儲(chǔ)那些被分配了但是沒(méi)有被使用,而未來(lái)可能會(huì)使用的值,以減小垃圾回收的壓力。文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。

前言

Go 1.3 的sync包中加入一個(gè)新特性:Pool。

這個(gè)類設(shè)計(jì)的目的是用來(lái)保存和復(fù)用臨時(shí)對(duì)象,以減少內(nèi)存分配,降低CG壓力。

type Pool 
func (p *Pool) Get() interface{} 
func (p *Pool) Put(x interface{}) 
New func() interface{} 

垃圾回收一直是Go語(yǔ)言的一塊心病,在它執(zhí)行垃圾回收的時(shí)間中,你很難做什么。

在垃圾回收壓力大的服務(wù)中,GC占據(jù)的CPU有可能超過(guò)2%,造成的Pause經(jīng)常超過(guò)2ms。垃圾嚴(yán)重的時(shí)候,秒級(jí)的GC也出現(xiàn)過(guò)。

如果經(jīng)常臨時(shí)使用一些大型結(jié)構(gòu)體,可以用Pool來(lái)減少GC。

示例代碼

package main
import (
 "fmt"
 "sync"
 "time"
)
type structR6 struct {
 B1 [100000]int
}
var r6Pool = sync.Pool{
 New: func() interface{} {
 return new(structR6)
 },
}
func usePool() {
 startTime := time.Now()
 for i := 0; i < 10000; i++ {
 sr6 := r6Pool.Get().(*structR6)
 sr6.B1[0] = 0
 r6Pool.Put(sr6)
 }
 fmt.Println("pool Used:", time.Since(startTime))
}
func standard() {
 startTime := time.Now()
 for i := 0; i < 10000; i++ {
 var sr6 structR6
 sr6.B1[0] = 0
 }
 fmt.Println("standard Used:", time.Since(startTime))
}
func main() {
 standard()
 usePool()
}

一個(gè)含有100000個(gè)int值的結(jié)構(gòu)體,在標(biāo)準(zhǔn)方法中,每次均新建,重復(fù)10000次,一共需要耗費(fèi)193ms;

如果用完的struct可以廢物利用,放回pool中。需要新的結(jié)構(gòu)體的時(shí)候,嘗試去pool中取,而不是重新生成,重復(fù)10000次僅需要693us。

這樣簡(jiǎn)單的操作,卻節(jié)約了99.65%的時(shí)間,也節(jié)約了各方面的資源。最重要的是它可以有效減少GC CPU和GC Pause。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • golang中接口對(duì)象的轉(zhuǎn)型兩種方式

    golang中接口對(duì)象的轉(zhuǎn)型兩種方式

    這篇文章主要介紹了golang中接口對(duì)象的轉(zhuǎn)型方式,大家都知道接口對(duì)象的轉(zhuǎn)型有兩種方式,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 阿里云go開(kāi)發(fā)環(huán)境搭建過(guò)程

    阿里云go開(kāi)發(fā)環(huán)境搭建過(guò)程

    這篇文章主要介紹了阿里云go開(kāi)發(fā)環(huán)境搭建過(guò)程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Gin框架使用panic處理中間件問(wèn)題詳解

    Gin框架使用panic處理中間件問(wèn)題詳解

    這篇文章主要介紹了Gin框架使用panic處理中間件問(wèn)題,在 Gin 框架中,錯(cuò)誤處理和 panic 處理是非常重要的功能。當(dāng)處理 HTTP 請(qǐng)求時(shí),可能會(huì)出現(xiàn)各種各樣的錯(cuò)誤,例如數(shù)據(jù)庫(kù)連接錯(cuò)誤、網(wǎng)絡(luò)錯(cuò)誤、權(quán)限問(wèn)題等等
    2023-04-04
  • 詳解如何在Go中如何編寫出可測(cè)試的代碼

    詳解如何在Go中如何編寫出可測(cè)試的代碼

    在編寫測(cè)試代碼之前,還有一個(gè)很重要的點(diǎn),容易被忽略,就是什么樣的代碼是可測(cè)試的代碼,所以本文就來(lái)聊一聊在?Go?中如何寫出可測(cè)試的代碼吧
    2023-08-08
  • Go使用Viper庫(kù)讀取YAML配置文件的示例代碼

    Go使用Viper庫(kù)讀取YAML配置文件的示例代碼

    Viper是適用于Go應(yīng)用程序的完整配置解決方案,它被設(shè)計(jì)用于在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式,本文給大家介紹了Go使用Viper庫(kù)讀取YAML配置文件的方法,需要的朋友可以參考下
    2024-05-05
  • 使用Go和Gorm實(shí)現(xiàn)讀取SQLCipher加密數(shù)據(jù)庫(kù)

    使用Go和Gorm實(shí)現(xiàn)讀取SQLCipher加密數(shù)據(jù)庫(kù)

    本文檔主要描述通過(guò)Go和Gorm實(shí)現(xiàn)生成和讀取SQLCipher加密數(shù)據(jù)庫(kù)以及其中踩的一些坑,文章通過(guò)代碼示例講解的非常詳細(xì), 對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • Go語(yǔ)言中的內(nèi)存布局詳解

    Go語(yǔ)言中的內(nèi)存布局詳解

    這篇文章主要給大家介紹了Go語(yǔ)言中的內(nèi)存布局,那么本文中將嘗試解釋Go如何在內(nèi)存中構(gòu)建結(jié)構(gòu)體,以及結(jié)構(gòu)體在字節(jié)和比特位方面是什么樣子。 有需要的朋友們可以參考借鑒,感興趣的朋友們下面來(lái)跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • go語(yǔ)言操作es的實(shí)現(xiàn)示例

    go語(yǔ)言操作es的實(shí)現(xiàn)示例

    本文主要介紹了go語(yǔ)言操作es的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Go?gRPC服務(wù)端流式RPC教程示例

    Go?gRPC服務(wù)端流式RPC教程示例

    這篇文章主要為大家介紹了Go?gRPC服務(wù)端流式RPC教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go 類型轉(zhuǎn)換工具包strconv包的用法

    Go 類型轉(zhuǎn)換工具包strconv包的用法

    Go 語(yǔ)言的?strconv?包提供了用于基本數(shù)據(jù)類型之間轉(zhuǎn)換的函數(shù),本文主要介紹了Go 類型轉(zhuǎn)換工具包strconv包的用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05

最新評(píng)論