golang 几种字符串的连接方式

最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现。

实现方法

1. 直接使用运算符o

func BenchmarkAddStringWithOperator(b *testing.B) {

hello := "hello"

world := "world"

for i := 0; i < b.N; i++ {

_ = hello + "," + world

}

}

func BenchmarkAddMoreStringWithOperator(b *testing.B) {

hello := "hello"

world := "world"

for i := 0; i < b.N; i++ {

var str string

for i := 0; i < 100; i++ {

str += hello + "," + world

}

}

}

golang 里面的字符串都是不可变的,每次运算都会产生一个新的字符串,所以会产生很多临时的无用的字符串,不仅没有用,还会给 gc 带来额外的负担,所以性能比较差

2. fmt.Sprintf()

func BenchmarkAddStringWithSprintf(b *testing.B) {

hello := "hello"

world := "world"

for i := 0; i < b.N; i++ {

_ = fmt.Sprintf("%s,%s", hello, world)

}

}

内部使用 []byte 实现,不像直接运算符这种会产生很多临时的字符串,但是内部的逻辑比较复杂,有很多额外的判断,还用到了 interface,所以性能也不是很好

3. strings.Join()

func BenchmarkAddStringWithJoin(b *testing.B) {

hello := "hello"

world := "world"

for i := 0; i < b.N; i++ {

_ = strings.Join([]string{hello, world}, ",")

}

}

join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内存,一个一个字符串填入,在已有一个数组的情况下,这种效率会很高,但是本来没有,去构造这个数据的代价也不小

4. buffer.WriteString()

func BenchmarkAddStringWithBuffer(b *testing.B) {

hello := "hello"

world := "world"

for i := 0; i < b.N; i++ {

var buffer bytes.Buffer

buffer.WriteString(hello)

buffer.WriteString(",")

buffer.WriteString(world)

_ = buffer.String()

}

}

func BenchmarkAddMoreStringWithBuffer(b *testing.B) {

hello := "hello"

world := "world"

for i := 0; i < b.N; i++ {

var buffer bytes.Buffer

for i := 0; i < 100; i++ {

buffer.WriteString(hello)

buffer.WriteString(",")

buffer.WriteString(world)

}

_ = buffer.String()

}

}

这个比较理想,可以当成可变字符使用,对内存的增长也有优化,如果能预估字符串的长度,还可以用 buffer.Grow() 接口来设置 capacity

测试结果

BenchmarkAddStringWithOperator-8 50000000 28.4 ns/op 0 B/op 0 allocs/op

BenchmarkAddStringWithSprintf-8 10000000 234 ns/op 48 B/op 3 allocs/op

BenchmarkAddStringWithJoin-8 30000000 56.2 ns/op 16 B/op 1 allocs/op

BenchmarkAddStringWithBuffer-8 20000000 86.0 ns/op 112 B/op 1 allocs/op

BenchmarkAddMoreStringWithOperator-8 100000 14295 ns/op 58896 B/op 100 allocs/op

BenchmarkAddMoreStringWithBuffer-8 300000 4551 ns/op 5728 B/op 7 allocs/op

主要结论

在已有字符串数组的场合,使用 strings.Join() 能有比较好的性能

在一些性能要求较高的场合,尽量使用 buffer.WriteString() 以获得更好的性能

较少字符串连接的场景下性能最好,而且代码更简短清晰,可读性更好

如果需要拼接的不仅仅是字符串,还有数字之类的其他需求的话,可以考虑 fmt.Sprintf

参考链接

golang插入字符串_golang 几种字符串的连接方式相关推荐

  1. 技术点:connect函数的几种写法及连接方式

    技术点:connect函数的几种写法及连接方式 沭osTT 0.077 2020.07.21 09:38:09 字数 2,494 阅读 2,336 前言 conncet函数是QT中信号和槽机制的实现函 ...

  2. python中定义一个空的字符串_04python—15种字符串操作

    <python小白入门系列教程> 专栏 • 第04篇 字符串是 字符的序列 .字符串基本上就是一组单词.我几乎可以保证你在每个Python程序中都要用到字符串,所以请特别留心下面这部分的内 ...

  3. linux如何判断网线插入_【干货】配线架的连接方式有哪几种?配线架与交换机如何连接?...

    配线架主要是用于局端对前端信息点进行模块化管理的设备,是综合布线管理子系统中非常重要的组成部分,若是在综合布线时缺少配线架,那么前端信息点就会直接接入到交换机上,一旦线缆发生故障,很有可能导致整个网络 ...

  4. golang把数字变字符串_Golang - 数字转字符串

    发现go语言内置的数字转字符串较为复杂,需要使用strconv的库,特别是float转字符串.可以单独写一个文件处理数字转字符串,便于调用. package main import ( "s ...

  5. 威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!

    点击上方电工小青年,关注并星标 专业的电工电气领域自媒体,不容错过 欢迎转发朋友圈~ PLC常见的输入设备有按钮.行程开关.接近开关.转换开关.拨码器.各种传感器等,输出设备有继电器.接触器.电磁阀等 ...

  6. ds18b20和plc接线图_PLC与这7种设备的连接方式,一看就懂!

    PLC常见的输入设备有按钮.行程开关.接近开关.转换开关.拨码器.各种传感器等,输出设备有继电器.接触器.电磁阀等.正确地连接输入和输出电路,是保证PLC安全可靠工作的前提. 1.PLC与主令电器类设 ...

  7. python字符串拼接变量_python拼接变量、字符串的3种方法

    第一种,加号("+"): print 'py'+'thon' # output python str = 'py' print str+'thon' # output python ...

  8. python中字符串的几种表达方式(用什么方式表示字符串)

    今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 > ...

  9. python字符串怎么表示_python中字符串的几种表达方式(用什么方式表示字符串)...

    原博文 2018-11-21 18:45 − 说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. pytho ...

最新文章

  1. docker开源系统监控软件Nagios
  2. python基础指令-python基础语法,python 代码命令大全
  3. Python字符串基础操作
  4. update module
  5. ecshop各个文件夹作用
  6. SSM之SpringMVC框架
  7. Scaled Exponential Linear Unit
  8. Oracle学习资料汇集
  9. Linux查看opencv版本
  10. 可以免费文字识别app有哪些?有这3款app就能够实现提取文字自由
  11. potainer 日志_分享10个优秀的日志分析工具
  12. 百度指数使用小技巧(转)
  13. D3基础 | 条形图
  14. GTK3.0简易计算器
  15. 通过简单的演示理解TCP/IP网络
  16. 云呐|固定资产计提折旧怎么算
  17. AI基础——一阶谓词逻辑表示法
  18. 关于“尺蠖(huò)效应”
  19. 全球及中国数字乳房断层合成产品行业研究及十四五规划分析报告
  20. 没有网店经验的小商家在轻栈也可以将小程序商城搞得风生水起

热门文章

  1. 基于暗通道优先算法的去雾应用(Matlab/C++)
  2. JavaScript历史状态管理
  3. Luy 1.0 :一个React-like轮子的诞生
  4. ❀❀ selenium 学习网站 ★★★★★
  5. java代码代替xml实现图片
  6. php 按条件进行计算的方法
  7. 获得2007年度的ISA-SERVER MVP
  8. JS获取元素在页面的位置
  9. 使用Java进行串口SerialPort通讯
  10. Quartz.net 开源job调度框架(一)