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

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

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

前言

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

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

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

// 使用 + 拼接字符串
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 ,得到以下結果。這個壓測結果,留著跟下文的優(yōu)化后的結果做對比。

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 方法,很方便結合 Sync.Pool 使用。

區(qū)別

需要注意的是,String() 方法實現還是有些許區(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 轉成字符串,這需要另外申請內存,而 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 ,得到以下結果:

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)在內存方面,差距還是很明顯的。

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

相關文章

  • 一文帶你了解Go中跟蹤函數調用鏈的實現

    一文帶你了解Go中跟蹤函數調用鏈的實現

    這篇文章主要為大家詳細介紹了go如何實現一個自動注入跟蹤代碼,并輸出有層次感的函數調用鏈跟蹤命令行工具,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • Go語言圖片處理和生成縮略圖的方法

    Go語言圖片處理和生成縮略圖的方法

    這篇文章主要介紹了Go語言圖片處理和生成縮略圖的方法,涉及Go語言針對圖片操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • golang給函數參數設置默認值的幾種方式小結(函數參數默認值

    golang給函數參數設置默認值的幾種方式小結(函數參數默認值

    在日常開發(fā)中我們有時候需要使用默認設置,下面這篇文章主要給大家介紹了關于golang給函數參數設置默認值的幾種方式小結的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Go高級特性探究之協(xié)程池詳解

    Go高級特性探究之協(xié)程池詳解

    在并發(fā)編程中,協(xié)程是?Go?語言的核心特性之一,本文將介紹如何使用?Go?協(xié)程池構造一個協(xié)程池,并解決函數傳參問題、優(yōu)雅關閉協(xié)程池和保證協(xié)程安全的問題,感興趣的可以了解一下
    2023-06-06
  • golang判斷字符串是是否包含另一字符串的示例代碼

    golang判斷字符串是是否包含另一字符串的示例代碼

    在Go語言中,可以使用strings.Contains()函數來判斷一個字符串是否包含另一個字符串,該函數接受兩個參數:要搜索的字符串和要查找的子字符串,如果子字符串存在于要搜索的字符串中,則返回true,否則返回false,下面通過示例詳細介紹,感興趣的朋友一起看看吧
    2023-09-09
  • golang 獲取當前執(zhí)行程序路徑的操作

    golang 獲取當前執(zhí)行程序路徑的操作

    這篇文章主要介紹了golang 獲取當前程序執(zhí)行路徑的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go路由注冊方法詳解

    Go路由注冊方法詳解

    Go語言中,http.NewServeMux()和http.HandleFunc()是兩種不同的路由注冊方式,前者創(chuàng)建獨立的ServeMux實例,適合模塊化和分層路由,靈活性高,但啟動服務器時需要顯式指定,后者使用全局默認的http.DefaultServeMux,適合簡單場景,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • go語言使用pipe讀取子進程標準輸出的方法

    go語言使用pipe讀取子進程標準輸出的方法

    這篇文章主要介紹了go語言使用pipe讀取子進程標準輸出的方法,實例分析了Go語言針對進程操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 詳解Golang中select的使用與源碼分析

    詳解Golang中select的使用與源碼分析

    select?是?Go?提供的?IO?多路復用機制,可以用多個?case?同時監(jiān)聽多個?channl?的讀寫狀態(tài)。本文將從源碼角度帶大家了解一下select的使用,需要的可以參考一下
    2022-12-12
  • 一文帶你探索Go語言中crypto/md5標準庫的強大功能

    一文帶你探索Go語言中crypto/md5標準庫的強大功能

    我們將從MD5算法的基礎知識入手,逐步深入到如何在Go中有效使用crypto/md5標準庫,包括基本的使用方法、實際應用案例分析,以及性能和安全性的考量,需要的可以參考下
    2024-02-02

最新評論

鄂州市| 察雅县| 北票市| 龙口市| 河北区| 德钦县| 罗源县| 东阳市| 永泰县| 高平市| 阜城县| 万荣县| 依兰县| 上栗县| 克山县| 岚皋县| 波密县| 革吉县| 房产| 长武县| 汕尾市| 古蔺县| 迁安市| 龙游县| 修文县| 布拖县| 方城县| 姜堰市| 宁海县| 襄汾县| 济宁市| 永和县| 三亚市| 额尔古纳市| 含山县| 邛崃市| 延寿县| 宜兴市| 施甸县| 革吉县| 陕西省|