109人参与 • 2025-04-24 • Golang
使用完整的基准测试代码文件,可以直接运行来比较四种字符串拼接方法的性能。
for 索引 += 的方式for range += 的方式strings.join 的方式strings.builder 的方式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 推荐的高效字符串拼接方式,尤其在循环中拼接时,
// 可以减少内存分配。
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) {
// 模拟更长参数列表,避免误差过大
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 // 恢复
}
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
}
go test -bench=. -benchmem
示例输出结果(不同机器会略有不同):
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 | 测试函数名 |
| -8 | 使用的 cpu 线程数(8 核) |
| 500000 | b.n 的值,代表该函数跑了 50 万次 |
| 3500 ns/op | 每次调用耗时 3500 纳秒 |
| 120 b/op | 每次操作分配的字节数(字节越少越好) |
| 5 allocs/op | 每次操作的内存分配次数(次数越少越好) |
go 的基准测试自动决定运行次数(b.n),直到结果足够稳定。
| 方法 | ns/op | b/op | allocs/op | 说明 |
|---|---|---|---|---|
| echoall1 | 3500 ns | 120 b | 5 | += 每次创建新字符串,开销大 |
| echoall2 | 2400 ns | 104 b | 4 | range + +=,仍然多次内存分配 |
| echoall3 | 1600 ns | 80 b | 2 | join 比较高效 |
| echoall4 | 800 ns | 32 b | 1 | strings.builder 最优 |
到此这篇关于go语言中字符串四种拼接方式的性能对比的文章就介绍到这了,更多相关go字符串拼接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论