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

Go 庫bytes.Buffer和strings.Builder使用及性能對比

 更新時間:2022年12月15日 11:19:12   作者:小馬別過河  
這篇文章主要為大家介紹了Go 庫bytes.Buffer和strings.Builder使用及性能對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

字符串拼接是老生常談了。在 Go 語言中,常見的拼接字符串的方法有:用+號,或者使用fmt包的Sprintf。

str1 := "a" + "b" // str1: "ab"
str2 := fmt.Sprintf("%s%s", "a", "b") // str2: "ab"

字符串低層是不可修改的,所以每次拼接字符串,都需要重新分配內(nèi)存。如果需要頻繁拼接字符串,上面兩種方法可能性能低下。我們寫下壓測代碼

// 使用 + 拼接字符串
func BenchmarkConcatStrWithPlus(b *testing.B) {
	str := ""
	for i := 0; i < b.N; i++ {
		str += "test"
	}
}
// 使用 Sprintf 拼接字符串
func BenchmarkConcatStrWithSprintf(b *testing.B) {
	str := ""
	for i := 0; i < b.N; i++ {
		str = fmt.Sprintf("%s%s", str, "test")
	}
}

執(zhí)行: go test -bench . -benchmem ,得到以下結(jié)果。這個壓測結(jié)果,留著跟下文的優(yōu)化后的結(jié)果做對比。

goos: darwin
goarch: amd64
pkg: example/string
cpu: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
BenchmarkConcatStrWithPlus-8              329544             87040 ns/op          663108 B/op          1 allocs/op
BenchmarkConcatStrWithSprintf-8           308691            160075 ns/op         1241769 B/op          4 allocs/op
PASS
ok      example/string  78.604s

bytes.Buffer 和 strings.Builder

用法

bytes.Buffer 和 strings.Builder 底層類似,都是用一個 []byte 類型的切片來存字符串。用法也類似,零值可以直接使用。

bytes.Buffer 拼接字符串:

var buf bytes.Buffer
// 拼接 "a" 和 "b"
buf.WriteString("a")
buf.WriteString("b")
str := buf.String() // str 等于 "ab"

strings.Builder 拼接字符串:

var sb strings.Builder
// 拼接 "a" 和 "b"
sb.WriteString("a")  
sb.WriteString("b")
str := sb.String()   // str 等于 "ab"

并且,兩者都提供了 Reset 方法,很方便結(jié)合 Sync.Pool 使用。

區(qū)別

需要注意的是,String() 方法實現(xiàn)還是有些許區(qū)別的,摘取 bytes.Buffer 的String方法的源碼注釋:

// String returns the contents of the unread portion of the buffer
// as a string. If the Buffer is a nil pointer, it returns "<nil>".
//
// To build strings more efficiently, see the strings.Builder type.
func (b *Buffer) String() string {

bytes.Buffer 的 String 方法會把底層 []byte 轉(zhuǎn)成字符串,這需要另外申請內(nèi)存,而 strings.Builder 則不用。

性能對比

// 使用 bytes.Buffer 拼接字符串
func BenchmarkConcatStrWithBuf(b *testing.B) {
	var buf bytes.Buffer
	for i := 0; i < b.N; i++ {
		buf.WriteString("test")
	}
	_ = buf.String()
}
// 使用 strings.Builder 拼接字符串
func BenchmarkConcatStrWithSb(b *testing.B) {
	var sb strings.Builder
	for i := 0; i < b.N; i++ {
		sb.WriteString("test")
	}
	_ = sb.String()
}

執(zhí)行: go test -bench . -benchmem ,得到以下結(jié)果:

BenchmarkConcatStrWithBuf-8     87914572                17.51 ns/op           16 B/op          0 allocs/op
BenchmarkConcatStrWithSb-8      278124620                9.562 ns/op          22 B/op          0 allocs/op
PASS
ok      example/string  5.442s

對比上面的壓測,strings.Builder(22 B/op)、bytes.Buffer(16 B/op) 比 Sprintf(1241769 B/op)和 + 號(663108 B/op)在內(nèi)存方面,差距還是很明顯的。

以上就是Go 庫bytes.Buffer和strings.Builder使用及性能對比的詳細(xì)內(nèi)容,更多關(guān)于Go bytes.Buffer對比strings.Builder的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說起,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 詳解Golang語言HTTP客戶端實踐

    詳解Golang語言HTTP客戶端實踐

    本文主要介紹了Golang語言HTTP客戶端實踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 基于Golang實現(xiàn)Redis協(xié)議解析器

    基于Golang實現(xiàn)Redis協(xié)議解析器

    這篇文章主要為大家詳細(xì)介紹了如何通過GO語言編寫簡單的Redis協(xié)議解析器,文中的示例代碼講解詳細(xì),對我們深入了解Go語言有一定的幫助,需要的可以參考一下
    2023-03-03
  • 詳解Golang如何優(yōu)雅的終止一個服務(wù)

    詳解Golang如何優(yōu)雅的終止一個服務(wù)

    后端服務(wù)通常會需要創(chuàng)建子協(xié)程來進(jìn)行相應(yīng)的作業(yè),但進(jìn)程接受到終止信號或正常結(jié)束時,并沒有判斷或等待子協(xié)程執(zhí)行結(jié)束,下面這篇文章主要給大家介紹了關(guān)于Golang如何優(yōu)雅的終止一個服務(wù)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 淺談Golang如何使用Viper進(jìn)行配置管理

    淺談Golang如何使用Viper進(jìn)行配置管理

    在Golang生態(tài)中,Viper是一個不錯的開源配置管理框架,這篇文章主要為大家介紹了Golang如何使用Viper進(jìn)行配置管理,需要的可以參考一下
    2023-06-06
  • Go1.20?arena新特性示例詳解

    Go1.20?arena新特性示例詳解

    這篇文章主要為大家介紹了Go1.20?arena新特性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Go語言的Channel遍歷方法詳解

    Go語言的Channel遍歷方法詳解

    這篇文章主要介紹了Go語言的Channel遍歷方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang中使用匿名結(jié)構(gòu)體的方法

    golang中使用匿名結(jié)構(gòu)體的方法

    這篇文章主要介紹了golang中使用匿名結(jié)構(gòu)體,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 基于Golang實現(xiàn)Redis分布式鎖解決秒殺問題

    基于Golang實現(xiàn)Redis分布式鎖解決秒殺問題

    這篇文章主要給大家介紹了使用Golang實現(xiàn)Redis分布式鎖解決秒殺問題,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • Go singleflight使用以及原理

    Go singleflight使用以及原理

    singleflight官方解釋其為:singleflight提供了一個重復(fù)的函數(shù)調(diào)用抑制機(jī)制。通俗的解釋其作用是,若有多個協(xié)程運行某函數(shù)時,只讓一個協(xié)程去處理,然后批量返回。非常適合來做并發(fā)控制。常見用于緩存穿透的情況
    2023-01-01

最新評論