golang 幾種字串的連線方式

2021-09-27 04:20:12 字數 2192 閱讀 7287

最近在做效能優化,有個函式裡面的耗時特別長,看裡面的操作大多是一些字串拼接的操作,而字串拼接在 golang 裡面其實有很多種實現。

1. 直接使用運算子

func benchmarkaddstringwithoperator(b *testing.b) 

}func benchmarkaddmorestringwithoperator(b *testing.b)

}}

golang 裡面的字串都是不可變的,每次運算都會產生乙個新的字串,所以會產生很多臨時的無用的字串,不僅沒有用,還會給 gc 帶來額外的負擔,所以效能比較差

2. fmt.sprintf()

func benchmarkaddstringwithsprintf(b *testing.b) 

}

內部使用byte實現,不像直接運算子這種會產生很多臨時的字串,但是內部的邏輯比較複雜,有很多額外的判斷,還用到了inte***ce,所以效能也不是很好

3. strings.join()

func benchmarkaddstringwithjoin(b *testing.b) , ",")

}}

join會先根據字串陣列的內容,計算出乙個拼接之後的長度,然後申請對應大小的記憶體,乙個乙個字串填入,在已有乙個陣列的情況下,這種效率會很高,但是本來沒有,去構造這個資料的代價也不小

4. buffer.writestring()

func benchmarkaddstringwithbuffer(b *testing.b) 

}func benchmarkaddmorestringwithbuffer(b *testing.b)

_ = buffer.string()

}}

這個比較理想,可以當成可變字元使用,對記憶體的增長也有優化,如果能預估字串的長度,還可以用buffer.grow()介面來設定 capacity

benchmarkaddstringwithoperator-8                50000000                28.4 ns/op             0 b/op          0 allocs/op

benchmarkaddstringwithsprintf-8 10000000 234 ns/op 48 b/op 3 allocs/op

benchmarkaddstringwithjoin-8 30000000 56.2 ns/op 16 b/op 1 allocs/op

benchmarkaddstringwithbuffer-8 20000000 86.0 ns/op 112 b/op 1 allocs/op

benchmarkaddmorestringwithoperator-8 100000 14295 ns/op 58896 b/op 100 allocs/op

benchmarkaddmorestringwithbuffer-8 300000 4551 ns/op 5728 b/op 7 allocs/op

這個是在我的自己 mac 上面跑的結果,go 版本go version go1.8 darwin/amd64,這個結果僅供參考,還是要以實際生產環境的值為準,**在:

在已有字串陣列的場合,使用strings.join()能有比較好的效能

在一些效能要求較高的場合,盡量使用buffer.writestring()以獲得更好的效能

較少字串連線的場景下效能最好,而且**更簡短清晰,可讀性更好

如果需要拼接的不僅僅是字串,還有數字之類的其他需求的話,可以考慮fmt.sprintfgo語言字串拼接效能分析: 

Golang幾種連線字串方法

golang中字串是不可變的使用utf 8編碼任意位元組鏈。把乙個或多個字元相加稱為字串連線。最簡單的方式使用 操作符,本文介紹多種方式連線字串。首先介紹簡單使用 操作符 package main import fmt func main 輸出結果 result hello,golang 既然加操作...

Golang字串的連線方式

func benchmarkaddstringwithoperator b testing.b golang 裡面的字串都是不可變的,每次運算都會產生乙個新的字串,所以會產生很多臨時的無用的字串,不僅沒有用,還會給 gc 帶來額外的負擔,所以效能比較差 func benchmarkaddstring...

golang 幾種字串的拼接方式

最近在做效能優化,有個函式裡面的耗時特別長,看裡面的操作大多是一些字串拼接的操作,而字串拼接在 golang 裡面其實有很多種實現。1.直接使用運算子func benchmarkaddstringwithoperator b testing.b golang 裡面的字串都是不可變的,每次運算都會產生...