Go字符串拼接:copy函数快1000倍

在日常开发中,每位开发人员都会面临连接字符串的任务。在Go语言中,我们可以使用+操作符、bytes.Bufferstrings.Builder等方法来拼接字符串。

基准测试

为了对比这些方法的性能,我编写了下面的基准测试代码:

go 复制代码
package main  
  
import (  
    "bytes"  
    "strings"    
    "testing"
)  
  
func BenchmarkConcat(b *testing.B) {  
    var str string  
    for n := 0; n < b.N; n++ {  
       str += "x"  
    }  
    b.StopTimer() 
}  
  
func BenchmarkBuffer(b *testing.B) {  
    var buffer bytes.Buffer  
    for n := 0; n < b.N; n++ {  
       buffer.WriteString("x")  
    }  
    b.StopTimer()
}  
  
func BenchmarkCopy(b *testing.B) {  
    bs := make([]byte, b.N)  
    bl := 0  
  
    b.ResetTimer()  
    for n := 0; n < b.N; n++ {  
       bl += copy(bs[bl:], "x")  
    }  
    b.StopTimer() 
}  

func BenchmarkBuilder(b *testing.B) {  
    var str strings.Builder  
    for n := 0; n < b.N; n++ {  
       str.WriteString("x")  
    }  
    b.StopTimer() 
}

在命令行,进入到测试文件所在目录,执行命令:

ini 复制代码
go test -bench=Benchmark* -benchmem

等待一会,输出测试结果:

bash 复制代码
BenchmarkConcat-20       1000000             64276 ns/op          503995 B/op          1 allocs/op
BenchmarkBuffer-20      349817613                3.283 ns/op           3 B/op          0 allocs/op
BenchmarkCopy-20        705887335                1.714 ns/op           0 B/op          0 allocs/op
BenchmarkBuilder-20     637184155                2.125 ns/op           5 B/op          0 allocs/op

`` 上面的测试结果显示了四种连接字符串的性能。

  1. +操作符:

    • 执行时间:64,276 纳秒/op
    • 内存分配:503,995 字节/op
    • 分配次数:1 次/op

    分析:

    • 使用 += 运算符进行字符串拼接,它在每次迭代都会创建一个新的字符串,导致较大的内存分配和分配次数。
    • 总体而言,这种方法的性能相对较差。
  2. bytes.Buffer:

    • 执行时间:3.283 纳秒/op
    • 内存分配:3 字节/op
    • 分配次数:0 次/op

    分析:

    • 使用 bytes.Buffer 类型,这是一种性能较好的字符串拼接方法。
    • 它几乎没有内存分配,并且执行时间非常短,是一种高效的拼接方式。
  3. Copy:

    • 执行时间:1.714 纳秒/op
    • 内存分配:0 字节/op
    • 分配次数:0 次/op

    分析:

    • 使用 copy 函数,直接在预分配的字节数组上进行拷贝。
    • 具有最低的执行时间和零内存分配,是最高效的字符串拼接方式。
  4. strings.Builder:

    • 执行时间:2.125 纳秒/op
    • 内存分配:5 字节/op
    • 分配次数:0 次/op

    分析:

    • 使用 strings.Builder 类型,性能介于 bytes.Buffercopy 之间。
    • 有一些内存分配,但仍然是一种有效的拼接方法。

总结:

  • 在这个基准测试中,copy 函数的性能最佳,其次是 bytes.Bufferstrings.Builder,而使用 += 运算符的性能最差。
  • 在选择字符串拼接方法时,应根据实际需求和性能要求选择适当的方式,避免不必要的内存分配,提高程序执行效率。
  • 使用strings.Builder兼顾了用法和性能,是一种值得推荐的拼接方式。

测试代码 gobyexample/string-concat/string_concat_test.go at master · denglei1024/gobyexample (github.com)

相关推荐
用户34232323763179 小时前
开源!Go+Wails+Vue3 手搓一个 PLC 实时监控桌面工具
go
止语Lab9 小时前
为什么你的 Go TCP server P99 延迟这么高
go
Andy Dennis16 小时前
nsq学习记录
消息队列·go·nsq
韦胖漫谈IT18 小时前
选语言不是站队,是选适合问题的工具
java·python·ai·rust·go·技术落地
喵个咪1 天前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
夜悊1 天前
Go网络编程的学习代码示例:客户端/服务端(C/S)模型
go
审判长烧鸡2 天前
【AI问答】GO代码循环返值
go
捧 花2 天前
Eino框架记忆功能实现指南
go·agent·eino
Java陈序员2 天前
主流数据库通吃!一款开源实用的数据库备份管理工具!
react.js·postgresql·go
云浪2 天前
搞懂 Go WaitGroup:一篇文章彻底理解并发等待机制
后端·go