golang 幾種字串的拼接方式

2021-08-16 22:21:33 字數 1475 閱讀 1238

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

1.直接使用運算子

func benchmarkaddstringwithoperator(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) 

}

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

benchmarkaddstringwithoperator-8

50000000

30.3 ns/op

benchmarkaddstringwithsprintf-8

5000000

261 ns/op

benchmarkaddstringwithjoin-8

30000000

58.7 ns/op

benchmarkaddstringwithbuffer-8

2000000000

0.00 ns/op

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

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

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

效能要求不太高的場合,直接使用運算子,**更簡短清晰,能獲得比較好的可讀性

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

Golang 字串拼接

字串拼接應該在程式設計過程中比較常用的操作了,在go語言中對字串的拼接有多種處理方式,以下通過例項來一一講解 這種應該是最直接最簡單的方式了。func stringplus string 複製 執行go test bench benchmem 檢視效能輸出如下 benchmarkstringplus...

golang字串拼接方式

字串拼接是字元的常見操作。在golang中,遇見了字串拼接。作為乙個長期的c程式設計師,我第一反應是 字串拼接函式strcat,但發現golang並無字串拼接函式。我想起了最簡單的方法,通過 操作符進行字串拼接。但我查了相關資料後發現 golang中的string型別也是唯讀且不可變的 因此,這種拼...

golang中的字串拼接

由於golang中的字串是不可變的型別,因此用 連線會產生乙個新的字串對效率有影響。這種方式實現的字串拼接過程最簡單,在實際中這種拼接方式在應對少量拼接時,效率還是不錯的。s1 hello s2 world s3 s1 s2 fmt.print s3 s3 helloworld 使用sprintf函...