golang插入字符串_golang 几种字符串的连接方式
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 几种字符串的连接方式相关推荐
- 技术点:connect函数的几种写法及连接方式
技术点:connect函数的几种写法及连接方式 沭osTT 0.077 2020.07.21 09:38:09 字数 2,494 阅读 2,336 前言 conncet函数是QT中信号和槽机制的实现函 ...
- python中定义一个空的字符串_04python—15种字符串操作
<python小白入门系列教程> 专栏 • 第04篇 字符串是 字符的序列 .字符串基本上就是一组单词.我几乎可以保证你在每个Python程序中都要用到字符串,所以请特别留心下面这部分的内 ...
- linux如何判断网线插入_【干货】配线架的连接方式有哪几种?配线架与交换机如何连接?...
配线架主要是用于局端对前端信息点进行模块化管理的设备,是综合布线管理子系统中非常重要的组成部分,若是在综合布线时缺少配线架,那么前端信息点就会直接接入到交换机上,一旦线缆发生故障,很有可能导致整个网络 ...
- golang把数字变字符串_Golang - 数字转字符串
发现go语言内置的数字转字符串较为复杂,需要使用strconv的库,特别是float转字符串.可以单独写一个文件处理数字转字符串,便于调用. package main import ( "s ...
- 威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!
点击上方电工小青年,关注并星标 专业的电工电气领域自媒体,不容错过 欢迎转发朋友圈~ PLC常见的输入设备有按钮.行程开关.接近开关.转换开关.拨码器.各种传感器等,输出设备有继电器.接触器.电磁阀等 ...
- ds18b20和plc接线图_PLC与这7种设备的连接方式,一看就懂!
PLC常见的输入设备有按钮.行程开关.接近开关.转换开关.拨码器.各种传感器等,输出设备有继电器.接触器.电磁阀等.正确地连接输入和输出电路,是保证PLC安全可靠工作的前提. 1.PLC与主令电器类设 ...
- python字符串拼接变量_python拼接变量、字符串的3种方法
第一种,加号("+"): print 'py'+'thon' # output python str = 'py' print str+'thon' # output python ...
- python中字符串的几种表达方式(用什么方式表示字符串)
今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 > ...
- python字符串怎么表示_python中字符串的几种表达方式(用什么方式表示字符串)...
原博文 2018-11-21 18:45 − 说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. pytho ...
最新文章
- docker开源系统监控软件Nagios
- python基础指令-python基础语法,python 代码命令大全
- Python字符串基础操作
- update module
- ecshop各个文件夹作用
- SSM之SpringMVC框架
- Scaled Exponential Linear Unit
- Oracle学习资料汇集
- Linux查看opencv版本
- 可以免费文字识别app有哪些?有这3款app就能够实现提取文字自由
- potainer 日志_分享10个优秀的日志分析工具
- 百度指数使用小技巧(转)
- D3基础 | 条形图
- GTK3.0简易计算器
- 通过简单的演示理解TCP/IP网络
- 云呐|固定资产计提折旧怎么算
- AI基础——一阶谓词逻辑表示法
- 关于“尺蠖(huò)效应”
- 全球及中国数字乳房断层合成产品行业研究及十四五规划分析报告
- 没有网店经验的小商家在轻栈也可以将小程序商城搞得风生水起