简介
使用完整的基准测试代码文件,可以直接运行来比较四种字符串拼接方法的性能。
写一个基准测试文件
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: darwingoarch: amd64pkg: exampleBenchmarkEchoAll1-8 500000 3500 ns/op 120 B/op 5 allocs/opBenchmarkEchoAll2-8 700000 2400 ns/op 104 B/op 4 allocs/opBenchmarkEchoAll3-8 1000000 1600 ns/op 80 B/op 2 allocs/opBenchmarkEchoAll4-8 2000000 800 ns/op 32 B/op 1 allocs/opPASSok example 3.456s
复制代码 每一行含义:
字段含义BenchmarkEchoAll1测试函数名-8使用的 CPU 线程数(8 核)500000b.N 的值,代表该函数跑了 50 万次3500 ns/op每次调用耗时 3500 纳秒120 B/op每次操作分配的字节数(字节越少越好)5 allocs/op每次操作的内存分配次数(次数越少越好)的基准测试自动决定运行次数(),直到结果足够稳定。
方法ns/opB/opallocs/op说明EchoAll13500 ns120 B5+= 每次创建新字符串,开销大EchoAll22400 ns104 B4range + +=,仍然多次内存分配EchoAll31600 ns80 B2Join 比较高效EchoAll4800 ns32 B1strings.Builder 最优到此这篇关于Go语言中字符串四种拼接方式的性能对比的文章就介绍到这了,更多相关Go字符串拼接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:互联网
免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作! |
|