最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang性能優(yōu)化的技巧分享

 更新時(shí)間:2023年07月31日 10:55:26   作者:燕過蓮開  
性能優(yōu)化的前提是滿足正確可靠、簡潔清晰等質(zhì)量因素,針對?Go語言特性,本文為大家整理了一些Go語言相關(guān)的性能優(yōu)化建議,感興趣的可以了解一下

一.簡介

? 性能優(yōu)化的前提是滿足正確可靠、簡潔清晰等質(zhì)量因素。性能優(yōu)化是綜合評估,有時(shí)候時(shí)間效率和空間效率可能對立。針對 Go語言特性,下文介紹 Go 相關(guān)的性能優(yōu)化建議。

二.性能優(yōu)化建議

1.Benchmark

Benchmark能夠?yàn)镚o語言提供支持基準(zhǔn)性能測試,能夠提供實(shí)際的數(shù)據(jù)衡量。通過go test -bench=. -benchmen命令進(jìn)行基準(zhǔn)性能測試。

// from fib.go
func Fib(n int) int {
    if n <2{
        return n
    }
	return Fib(n-1) + Fib(n-2)
}
// from fib_test.go
func BenchmarkFib10(b *testing.B) {
    // run the Fib function b.N times
    for n := 0; n < b.N; n++{
        Fib(10)
    }
}

結(jié)果說明:

第四行第一個(gè)結(jié)果表示BenchmarkFib10是測試函數(shù)名8 表示GOMAXPROCS的值為8,第四行第二個(gè)結(jié)果表示一共執(zhí)行1855870次即b.N的值,第四行第三個(gè)結(jié)果表示每次執(zhí)行花費(fèi)602.5ns,第四行第四個(gè)結(jié)果表示每次執(zhí)行申請多大的內(nèi)存,第四行第五個(gè)結(jié)果表示每次執(zhí)行申請的幾次內(nèi)存。

2.slice

? slice可以預(yù)分配內(nèi)存,使用make() 初始化切片時(shí)提供容量信息。

func NoPreAlloc( size int) {
    data := make([]int, 0)
    for k := 0; k < size; k++ {
        data = append( data, k )
    }
}
func PreAlloc(size int) {
    data := make([]int, 0, size )
    for k := 0; k < size; k++ {
        data = append( data, k )
    }
}

實(shí)驗(yàn)結(jié)果:

切片本質(zhì)是一個(gè)數(shù)組片段的描述包括數(shù)組指針,片段的長度,片段的容量(不改變內(nèi)存分配情況下的最大長度)。切片操作并不復(fù)制切片指向的元素,創(chuàng)建一個(gè)新的切片會復(fù)用原來切片的底層數(shù)組。

3.map

map預(yù)分配內(nèi)存

func NoPreAlloc(size int) {
    data := make(map[int]int )
    for i := 0; i < size; i++ {
        data[i] = 1
    }
}
func PreAlloc(size int) {
    data := make(map[int]int, size)
    for i := 0; i < size; i++{
		data[i] = 1
    } 
}

實(shí)驗(yàn)結(jié)果:

不斷向 map 中添加元素的操作會觸發(fā) map 的擴(kuò)容,提前分配好空間可以減少內(nèi)存拷貝和 Rehash 的消耗,根據(jù)實(shí)際需求提前預(yù)估好需要的空間。

4.字符串處理

使用strings.Builder

func ByteBuffer(n int, str string) string {
    buf := new( bytes .Buffer)
    for i := 0;i < n; i++ {
        buf.writeString(str)
    }
    return buf.String()
}

實(shí)驗(yàn)結(jié)果:

使用 +字符串拼接性能最差,strings.Builder,bytes.Buffer 相近,strings.Buffer 更快。字符串在 Go語言中是不可變類型,占用內(nèi)存大小是固定的。使用 + 每次都會重新分配內(nèi)存。strings.Builder,bytes.Buffer 底層都是 []byte 數(shù)組。內(nèi)存擴(kuò)容策略不需要每次拼接重新分配內(nèi)存。

5.空結(jié)構(gòu)體

空結(jié)構(gòu)體 struct{}實(shí)例不占據(jù)任何的內(nèi)存空間??勺鳛楦鞣N場景下的占位符使用,節(jié)省資源,空結(jié)構(gòu)體本身具備很強(qiáng)的語義,即這里不需要任何值,僅作為占位符。

func EmptyStructMap(n int) {
    m := make(map[int]struct{})
    for i := 0;i < n; i++ {
        m[i] = struct{}{}
    }
}
func BoolMap(n int) {
    m := make(map[int]bool)
    for i := 0;i < n; i++ {
        m[i] = false
    }
}

實(shí)驗(yàn)結(jié)果:

實(shí)現(xiàn) Set,可以考慮用 map 來代替。對于這個(gè)場景,只需要用到 map 的鍵,而不需要值。即使是將 map 的值設(shè)置為 bool 類型,也會多占據(jù) 1個(gè)字節(jié)空間。

6.atomic

使用atomic包

type atomicCounter struct {
    i int32
}
func AtomicAddOne( c
*atomicCounter) {
    atomic.AddInt32( &c.i, 1)
}
type mutexCounter struct {
    i int32
    m sync.Mutex
}
func MutexAddOne(c *mutexCounter) {
    c.m.Lock()
	c.i+
	c.m.Unlock()
}

實(shí)驗(yàn)結(jié)果:

鎖的實(shí)現(xiàn)是通過操作系統(tǒng)來實(shí)現(xiàn),屬于系統(tǒng)調(diào)用。atomic 操作是通過硬件實(shí)現(xiàn),效率比鎖高。sync.Mutex 應(yīng)該用來保護(hù)一段邏輯,不僅僅用于保護(hù)一個(gè)變量。對于非數(shù)值操作,可以使用 atomic.Value,能承載一個(gè)interface。

三.小結(jié)

避免常見的性能陷阱可以保證大部分程序的性能。普通應(yīng)用代碼,不要一味地追求程序的性能。越高級的性能優(yōu)化手段越容易出現(xiàn)問題。在滿足正確可靠、簡潔清晰的質(zhì)量要求的前提下提高程序性能。

到此這篇關(guān)于Golang性能優(yōu)化的技巧分享的文章就介紹到這了,更多相關(guān)Go性能優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中調(diào)用deepseekr1的教程詳解

    Golang中調(diào)用deepseekr1的教程詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中調(diào)用deepseekr1的相關(guān)教程,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2025-02-02
  • Go語言實(shí)現(xiàn)生成樣式美觀的PDF文件

    Go語言實(shí)現(xiàn)生成樣式美觀的PDF文件

    使用?Go?語言生成樣式美觀的?PDF?文件是一個(gè)常見的需求,尤其是在報(bào)告生成、發(fā)票、合同等場景中,下面就跟隨小編一起來學(xué)習(xí)一下具體實(shí)現(xiàn)方法吧
    2025-01-01
  • 使用Go語言開發(fā)任務(wù)待辦清單Web應(yīng)用

    使用Go語言開發(fā)任務(wù)待辦清單Web應(yīng)用

    在學(xué)習(xí) Go 的過程中,一個(gè)非常適合入門的 Web 項(xiàng)目就是 TodoList(任務(wù)待辦清單),本文將為大家詳細(xì)介紹一下具體實(shí)現(xiàn)方法,希望對大家有所幫助
    2025-09-09
  • golang實(shí)現(xiàn)并發(fā)控制的方法和技巧

    golang實(shí)現(xiàn)并發(fā)控制的方法和技巧

    golang 是一門支持并發(fā)的編程語言,它提供了 goroutine 和 channel 等強(qiáng)大的特性,讓我們可以輕松地創(chuàng)建和管理多個(gè)執(zhí)行單元,實(shí)現(xiàn)高效的任務(wù)處理,在本文中,我們將介紹一些 golang 的并發(fā)控制的方法和技巧,希望對你有所幫助
    2024-03-03
  • 實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫操作示例詳解

    實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫操作示例詳解

    這篇文章主要為大家介紹了實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解如何使用Golang擴(kuò)展Envoy

    詳解如何使用Golang擴(kuò)展Envoy

    這篇文章主要為大家介紹了詳解如何使用Golang擴(kuò)展Envoy實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Go語言并發(fā)之Sync包的6個(gè)關(guān)鍵概念總結(jié)

    Go語言并發(fā)之Sync包的6個(gè)關(guān)鍵概念總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語言并發(fā)中Sync包的6個(gè)關(guān)鍵概念,文中的示例代碼講解詳細(xì),對我們深入學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2023-05-05
  • golang 連接mongoDB的方法示例

    golang 連接mongoDB的方法示例

    這篇文章主要介紹了golang 連接mongoDB的方法示例,詳細(xì)的介紹了golang的基礎(chǔ)知識和連接mongoDB的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • golang協(xié)程設(shè)計(jì)及調(diào)度原理

    golang協(xié)程設(shè)計(jì)及調(diào)度原理

    這篇文章主要介紹了golang協(xié)程設(shè)計(jì)及調(diào)度原理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • go語言使用pipe讀取子進(jìn)程標(biāo)準(zhǔn)輸出的方法

    go語言使用pipe讀取子進(jìn)程標(biāo)準(zhǔn)輸出的方法

    這篇文章主要介紹了go語言使用pipe讀取子進(jìn)程標(biāo)準(zhǔn)輸出的方法,實(shí)例分析了Go語言針對進(jìn)程操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03

最新評論

华阴市| 商丘市| 遂平县| 乌兰浩特市| 寿阳县| 明溪县| 剑河县| 大洼县| 镇江市| 定安县| 开阳县| 桐梓县| 金门县| 南岸区| 潞西市| 依安县| 城固县| 留坝县| 峨眉山市| 紫云| 岳西县| 尤溪县| 尼木县| 德保县| 永福县| 容城县| 胶州市| 丰宁| 宁明县| 吉安县| 长春市| 乐平市| 民勤县| 浑源县| 乌什县| 镇赉县| 西畴县| 伽师县| 鄂托克前旗| 静海县| 中阳县|