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

Go語(yǔ)言中字符串四種拼接方式的性能對(duì)比

 更新時(shí)間:2025年04月10日 08:19:04   作者:唐青楓  
在go語(yǔ)言中,字符串是不可變的,因此字符串之間的拼接實(shí)際上是創(chuàng)建了一個(gè)新的字符串,如果頻繁操作會(huì)對(duì)性能產(chǎn)生嚴(yán)重的影響,下面我們來(lái)看看Go語(yǔ)言中字符串四種常見(jiàn)拼接方式的性能對(duì)比吧

簡(jiǎn)介

使用完整的基準(zhǔn)測(cè)試代碼文件,可以直接運(yùn)行來(lái)比較四種字符串拼接方法的性能。

  • for 索引 += 的方式
  • for range += 的方式
  • strings.Join 的方式
  • strings.Builder 的方式

寫一個(gè)基準(zhǔn)測(cè)試文件

echo_bench_test.go

package main

import (
	"os"
	"strings"
	"testing"
)

func echoAll1() string {
	var s, sep string
	for i := 0; i < len(os.Args); i++ {
		s += sep + os.Args[i]
		sep = " "
	}
	return s
}

func echoAll2() string {
	s, sep := "", ""
	for _, arg := range os.Args[:] {
		s += sep + arg
		sep = " | "
	}
	return s
}

func echoAll3() string {
	return strings.Join(os.Args[:], " , ")
}

// strings.Builder 是 Go 推薦的高效字符串拼接方式,尤其在循環(huán)中拼接時(shí),
// 可以減少內(nèi)存分配。


func echoAll4() string {
	var builder strings.Builder
	for i, arg := range os.Args[:] {
		if i > 0 {
			builder.WriteString(" <> ")
		}
		builder.WriteString(arg)
	}
	return builder.String()
}


// ===== Benchmark Functions =====

func BenchmarkEchoAll1(b *testing.B) {
	// 模擬更長(zhǎng)參數(shù)列表,避免誤差過(guò)大
	originalArgs := os.Args
	os.Args = make([]string, 100)
	for i := range os.Args {
		os.Args[i] = "arg"
	}

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = echoAll1()
	}
	os.Args = originalArgs // 恢復(fù)
}

func BenchmarkEchoAll2(b *testing.B) {
	originalArgs := os.Args
	os.Args = make([]string, 100)
	for i := range os.Args {
		os.Args[i] = "arg"
	}

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = echoAll2()
	}
	os.Args = originalArgs
}

func BenchmarkEchoAll3(b *testing.B) {
	originalArgs := os.Args
	os.Args = make([]string, 100)
	for i := range os.Args {
		os.Args[i] = "arg"
	}

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = echoAll3()
	}
	os.Args = originalArgs
}

func BenchmarkEchoAll4(b *testing.B) {
	originalArgs := os.Args
	os.Args = make([]string, 100)
	for i := range os.Args {
		os.Args[i] = "arg"
	}

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = echoAll4()
	}
	os.Args = originalArgs
}

運(yùn)行基準(zhǔn)測(cè)試

go test -bench=. -benchmem

示例輸出結(jié)果(不同機(jī)器會(huì)略有不同):

goos: darwin
goarch: amd64
pkg: example
BenchmarkEchoAll1-8     500000     3500 ns/op     120 B/op     5 allocs/op
BenchmarkEchoAll2-8     700000     2400 ns/op     104 B/op     4 allocs/op
BenchmarkEchoAll3-8    1000000     1600 ns/op      80 B/op     2 allocs/op
BenchmarkEchoAll4-8    2000000      800 ns/op      32 B/op     1 allocs/op

PASS
ok      example    3.456s

每一行含義:

字段含義
BenchmarkEchoAll1測(cè)試函數(shù)名
-8使用的 CPU 線程數(shù)(8 核)
500000b.N 的值,代表該函數(shù)跑了 50 萬(wàn)次
3500 ns/op每次調(diào)用耗時(shí) 3500 納秒
120 B/op每次操作分配的字節(jié)數(shù)(字節(jié)越少越好)
5 allocs/op每次操作的內(nèi)存分配次數(shù)(次數(shù)越少越好)

Go 的基準(zhǔn)測(cè)試自動(dòng)決定運(yùn)行次數(shù)(b.N),直到結(jié)果足夠穩(wěn)定。

方法ns/opB/opallocs/op說(shuō)明
EchoAll13500 ns120 B5+= 每次創(chuàng)建新字符串,開(kāi)銷大
EchoAll22400 ns104 B4range + +=,仍然多次內(nèi)存分配
EchoAll31600 ns80 B2Join 比較高效
EchoAll4800 ns32 B1strings.Builder 最優(yōu)

到此這篇關(guān)于Go語(yǔ)言中字符串四種拼接方式的性能對(duì)比的文章就介紹到這了,更多相關(guān)Go字符串拼接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你深入了解Golang中的自旋鎖

    一文帶你深入了解Golang中的自旋鎖

    自旋鎖是一種忙等待鎖,當(dāng)一個(gè)線程嘗試獲取一個(gè)已經(jīng)被其它線程持有的鎖時(shí),這個(gè)線程會(huì)持續(xù)循環(huán)檢查鎖的狀態(tài)(即“自旋”)?,直到鎖被釋放后獲得所有權(quán),下面我們就來(lái)深入了解下自旋鎖的具體操作吧
    2024-01-01
  • go grpc高級(jí)用法

    go grpc高級(jí)用法

    RPC是遠(yuǎn)程過(guò)程調(diào)用,可以像調(diào)用本地服務(wù)一樣取調(diào)用遠(yuǎn)程服務(wù),本文主要介紹了go grpc高級(jí)用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • golang架構(gòu)設(shè)計(jì)開(kāi)閉原則手寫實(shí)現(xiàn)

    golang架構(gòu)設(shè)計(jì)開(kāi)閉原則手寫實(shí)現(xiàn)

    這篇文章主要為大家介紹了golang架構(gòu)設(shè)計(jì)開(kāi)閉原則手寫實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go變量指針的實(shí)現(xiàn)示例

    Go變量指針的實(shí)現(xiàn)示例

    Go指針存儲(chǔ)變量地址,用于修改變量、避免拷貝、動(dòng)態(tài)分配,本文就來(lái)詳細(xì)的介紹一下Go變量指針的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • Golang中Context.WithCancel 的實(shí)戰(zhàn)指南

    Golang中Context.WithCancel 的實(shí)戰(zhàn)指南

    本文介紹了Go語(yǔ)言中context包的核心用法,重點(diǎn)講解了context.Background()和context.WithCancel()的使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-11-11
  • golang實(shí)現(xiàn)ip訪問(wèn)限制及提交次數(shù)

    golang實(shí)現(xiàn)ip訪問(wèn)限制及提交次數(shù)

    在?Web?應(yīng)用中,通常會(huì)需要對(duì)?IP?訪問(wèn)進(jìn)行限制以及控制提交次數(shù),本文將使用中間件或者基于?Redis?這樣的緩存服務(wù)來(lái)實(shí)現(xiàn),感興趣的可以了解下
    2024-10-10
  • Go語(yǔ)言編譯環(huán)境設(shè)置教程

    Go語(yǔ)言編譯環(huán)境設(shè)置教程

    Go語(yǔ)言支持高并發(fā)(goroutine)、自動(dòng)垃圾回收,編譯為跨平臺(tái)二進(jìn)制文件,云原生兼容且社區(qū)活躍,開(kāi)發(fā)便捷,內(nèi)置測(cè)試與vet工具輔助檢測(cè)錯(cuò)誤,依賴模塊化管理,提升開(kāi)發(fā)效率
    2025-07-07
  • Golang并發(fā)利器sync.Once的用法詳解

    Golang并發(fā)利器sync.Once的用法詳解

    在某些場(chǎng)景下,我們需要初始化一些資源。有時(shí)會(huì)采用延遲初始化的方式,在真正需要資源的時(shí)候才進(jìn)行初始化。在這種情況下,Go語(yǔ)言中的sync.Once提供一個(gè)優(yōu)雅且并發(fā)安全的解決方案,本文將對(duì)其進(jìn)行詳細(xì)介紹
    2023-04-04
  • go中channel通信的底層實(shí)現(xiàn)

    go中channel通信的底層實(shí)現(xiàn)

    Go語(yǔ)言channel通過(guò)同步/異步機(jī)制實(shí)現(xiàn)并發(fā)通信,避免鎖競(jìng)爭(zhēng),底層使用鎖、等待隊(duì)列、CAS和環(huán)形緩沖區(qū),確保高效、安全,支持select的非阻塞和喚醒處理,提升大規(guī)模并發(fā)下的穩(wěn)定性
    2025-10-10
  • golang組件swagger生成接口文檔實(shí)踐示例

    golang組件swagger生成接口文檔實(shí)踐示例

    這篇文章主要為大家介紹了golang組件swagger生成接口文檔實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評(píng)論

临漳县| 安新县| 凌云县| 贡觉县| 霍林郭勒市| 阜康市| 靖安县| 平安县| 友谊县| 那曲县| 库车县| 台北县| 海门市| 福州市| 淮安市| 安丘市| 开平市| 红原县| 绵阳市| 手游| 凤台县| 延川县| 开鲁县| 朝阳县| 汪清县| 吉木乃县| 洪泽县| 内乡县| 宜城市| 那坡县| 延安市| 鄯善县| 武冈市| 遂平县| 新平| 台湾省| 攀枝花市| 独山县| 富平县| 肥西县| 特克斯县|