Go语言字符串拼接性能对比与最佳实践 - 深度优化指南

boyanx15小时前技术教程1


字符串拼接在日常开发中非常的常见,go 也有多种方式可以进行字符串拼接,但是当数据量足够大的情况下,不同的拼接方式会产生显著的性能差异。本文通过基准测试数据,带您深入理解Go语言字符串操作的底层机制,文末附结论:最终字符串拼接最优的方式

一、常用拼接方式

  • +号拼接
  • fmt 占位符
  • strings.Builder
  • bytes.Buffer

二、性能对比实验

package main
import (
"bytes"
"fmt"
"strings"
"testing"
)
const LOOP = 1000
// BenchmarkStringAdd + 号拼接
func BenchmarkStringAdd(b *testing.B) {
for n := 0; n < b.N; n++ {
var s string
for j := 0; j < LOOP; j++ {
s += "gopher"
}
}
}
//
BenchmarkStringBytesBufferAdd bytes.Buffer 拼接

func BenchmarkStringFmtAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
var s string
for j := 0; j < LOOP; j++ {
s = fmt.Sprintf("%sgopher", s)
}
}
}
// BenchmarkStringBuilderAdd strings.Builder 拼接
func BenchmarkStringBuilderAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
var builder strings.Builder
for j := 0; j < LOOP; j++ {
builder.WriteString("gopher")
}
_ = builder.String()
}
}
//
BenchmarkStringBytesBufferAdd bytes.Buffer 拼接

func
BenchmarkStringBytesBufferAdd(b *testing.B) {

for i := 0; i < b.N; i++ {
var builder bytes.Buffer
for j := 0; j < LOOP; j++ {
builder.WriteString("gopher")
}
_ = builder.String()
}
}

执行测试:

# go test -bench='BenchmarkStringBuilderAdd' -cpu=2 -count=1 -benchmem .
BenchmarkStringBuilderAdd-2 259993 4663 ns/op 24824 B/op 14 allocs/op
PASS
ok learn-go 4.600s
# go test -bench='BenchmarkStringFmtAdd' -cpu=2 -count=1 -benchmem .
BenchmarkStringFmtAdd-2 2973 404782 ns/op 3231129 B/op 2002 allocs/op
PASS
ok learn-go 2.455s
# go test -bench='BenchmarkStringBuilderAdd' -cpu=2 -count=1 -benchmem .
BenchmarkStringBuilderAdd-2 256581 4671 ns/op 24824 B/op 14 allocs/op
PASS
ok learn-go 2.419s
# go test -bench='BenchmarkStringBytesBufferAdd' -cpu=2 -count=1 -benchmem .
BenchmarkStringBytesBufferAdd-2 206992 5818 ns/op 22464 B/op 9 allocs/op
PASS
ok it******.com/learn-go 2.459s

实测结果(MacBook M1 Pro):

从性能对比上可以看得出来,从内存分配、耗时上,strings.Builder、bytes.Buffer 的性能最优

三、各方案特性解析

方案

说明

+ 运算符拼接

适用场景:简单临时拼接(<10次)<br />隐患:每次操作生成新字符串,O(n^2)时间复杂度<br />内存分配:每次操作触发内存重新分配

fmt 运算拼接

适用场景:需要格式化输出的日志拼接、<br />混合数据类型(int/float/struct)转换<br />临时调试输出等非性能敏感场景

bytes.Buffer

高效构建字节,在处理二进制数据时效率较高,注意 buf 过大时会触发 panic

strings.Builder

高效构建字符串,使用Grow预分配提升性能

结论:

简单拼接场景:+ 运算符拼接、fmt 运算拼接都可以
大量字符串拼接:strings.Builder适用于处理二进制数据,像文件读写、网络数据传输等场景:bytes.Buffer

原文地址:
https://blog.fiveyoboy.com/articles/go-concat-string

相关文章

Python字符串比较的隐藏法则:Unicode对决、内存地址暗战!

字符串比较的底层规则核心原理:字符逐个对比,基于Unicode值一决胜负!# 规则演示:从首字符开始逐位比较 print("apple" > "app")...

【西门子】关于从S7-1200字符串中提取有效数值

PLC从上位机或智能设备读取到一组杂乱无章的字符数据,比如"A,1;22=333,5678,E.909" ,需要从这个字符串中把有用的数字提取出来(只提取数字,舍弃字母及标点),需要...

【超测前瞻】涅槃重生,这一世它是全能铲车王!

前言虽拥有大威力大口径主炮,但S系VIII级坦歼“库斯特工程”的表现并不如意,甚至在整个“液压攻城坦歼”家族当中,它的表现都要相对靠后。时光悄然流逝,库斯特工程已是边缘过气坦,它之前另一位早早进入超测...

Java中你知道几种从字符串中找指定的字符的数量

遇到这样的问题,常规的思路估计就是遍历String,然后逐个对比。下面先看循环遍历循环遍历private static int getNum(String originStr, String targ...

Python学不会来打我(8)字符串string类型深度解析

2025年全球开发者调查显示,90%的Python项目涉及字符串处理,而高效使用字符串可提升代码效率40%。本文系统拆解字符串核心操作,涵盖文本处理、数据清洗、模板生成等八大场景,助你掌握字符串编程精...

必看!Concatenate 函数 , 字符串拼装的 “拼接大师”,快学起来!

在 Excel 的函数大家庭里,Concatenate 函数就像是一位勤劳的 “拼接大师”,专门负责把多个文本字符串合并成一个连贯的文本字符串 。无论是处理姓名、地址,还是组合各种数据信息,它都能轻松...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。