亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一.簡介

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

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

1.Benchmark

Benchmark能夠為Go語言提供支持基準性能測試,能夠提供實際的數據衡量。通過go test -bench=. -benchmen命令進行基準性能測試。

// 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)
    }
}

結果說明:

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

2.slice

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

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 )
    }
}

實驗結果:

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

3.map

map預分配內存

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
    } 
}

實驗結果:

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

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()
}

實驗結果:

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

5.空結構體

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

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
    }
}

實驗結果:

實現 Set,可以考慮用 map 來代替。對于這個場景,只需要用到 map 的鍵,而不需要值。即使是將 map 的值設置為 bool 類型,也會多占據 1個字節(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()
}

實驗結果:

鎖的實現是通過操作系統來實現,屬于系統調用。atomic 操作是通過硬件實現,效率比鎖高。sync.Mutex 應該用來保護一段邏輯,不僅僅用于保護一個變量。對于非數值操作,可以使用 atomic.Value,能承載一個interface。

三.小結

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

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

相關文章

  • 淺析Go 字符串指紋

    淺析Go 字符串指紋

    這篇文章主要介紹了Go 字符串指紋的相關資料,幫助大家更好的理解和學習go語言,感興趣的朋友可以了解下
    2020-09-09
  • Go-家庭收支記賬軟件項目實現

    Go-家庭收支記賬軟件項目實現

    這篇文章主要介紹了Go-家庭收支記賬軟件項目實現,本文章內容詳細,具有很好的參考價值,希望對大家有所幫助,需要的朋友可以參考下
    2023-01-01
  • 以alpine作為基礎鏡像構建Golang可執(zhí)行程序操作

    以alpine作為基礎鏡像構建Golang可執(zhí)行程序操作

    這篇文章主要介紹了以alpine作為基礎鏡像構建Golang可執(zhí)行程序操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • GoLang channel使用介紹

    GoLang channel使用介紹

    Channel 和 goroutine 的結合是 Go 并發(fā)編程的大殺器。而 Channel 的實際應用也經常讓人眼前一亮,通過與 select,cancel,timer 等結合,它能實現各種各樣的功能。接下來,我們就要梳理一下 channel 的應用
    2022-10-10
  • 淺析Go中原子操作的重要性與使用

    淺析Go中原子操作的重要性與使用

    這篇文章主要帶大家一起探索?Go?中原子操作的概念,了解為什么它們是重要的,以及如何有效地使用它們,文中的示例代碼講解詳細,需要的可以了解下
    2023-11-11
  • CSP communicating sequential processes并發(fā)模型

    CSP communicating sequential processes并發(fā)模型

    這篇文章主要為大家介紹了CSP communicating sequential processes并發(fā)模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Golang中大端序和小端序的處理

    Golang中大端序和小端序的處理

    大端序和小端序是描述多字節(jié)數據在內存中存儲順序的術語,本文主要介紹了Golang中大端序和小端序的處理,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • Golang 空map和未初始化map的注意事項說明

    Golang 空map和未初始化map的注意事項說明

    這篇文章主要介紹了Golang 空map和未初始化map的注意事項說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言LeetCode500鍵盤行題解示例詳解

    Go語言LeetCode500鍵盤行題解示例詳解

    這篇文章主要為大家介紹了Go語言LeetCode500鍵盤行題解示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Golang Cron 定時任務的實現示例

    Golang Cron 定時任務的實現示例

    這篇文章主要介紹了Golang Cron 定時任務的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05

最新評論