golang 几种字符串的连接方式

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

实现方法

1. 直接使用运算符

  1. func BenchmarkAddStringWithOperator(b *testing.B) {
  2. hello := "hello"
  3. world := "world"
  4. for i := 0; i < b.N; i++ {
  5. _ = hello + "," + world
  6. }
  7. }

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

2. fmt.Sprintf()

  1. func BenchmarkAddStringWithSprintf(b *testing.B) {
  2. hello := "hello"
  3. world := "world"
  4. for i := 0; i < b.N; i++ {
  5. _ = fmt.Sprintf("%s,%s", hello, world)
  6. }
  7. }

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

3. strings.Join()

  1. func BenchmarkAddStringWithJoin(b *testing.B) {
  2. hello := "hello"
  3. world := "world"
  4. for i := 0; i < b.N; i++ {
  5. _ = strings.Join([]string{hello, world}, ",")
  6. }
  7. }

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

4. buffer.WriteString()

  1. func BenchmarkAddStringWithBuffer(b *testing.B) {
  2. hello := "hello"
  3. world := "world"
  4. for i := 0; i < 1000; i++ {
  5. var buffer bytes.Buffer
  6. buffer.WriteString(hello)
  7. buffer.WriteString(",")
  8. buffer.WriteString(world)
  9. _ = buffer.String()
  10. }
  11. }

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

测试结果

  1. BenchmarkAddStringWithOperator-8 50000000 30.3 ns/op
  2. BenchmarkAddStringWithSprintf-8 5000000 261 ns/op
  3. BenchmarkAddStringWithJoin-8 30000000 58.7 ns/op
  4. BenchmarkAddStringWithBuffer-8 2000000000 0.00 ns/op

这个是在我的自己 Mac 上面跑的结果,go 版本 go version go1.8 darwin/amd64,这个结果仅供参考,还是要以实际生产环境的值为准,代码在:https://github.com/hatlonely/hellogolang/blob/master/internal/buildin/string_test.go

主要结论

  1. 在已有字符串数组的场合,使用 strings.Join() 能有比较好的性能
  2. 在一些性能要求较高的场合,尽量使用 buffer.WriteString() 以获得更好的性能
  3. 性能要求不太高的场合,直接使用运算符,代码更简短清晰,能获得比较好的可读性
  4. 如果需要拼接的不仅仅是字符串,还有数字之类的其他需求的话,可以考虑 fmt.Sprintf

参考链接

go语言字符串拼接性能分析: http://herman.asia/efficient-string-concatenation-in-go

转载请注明出处 
本文链接:http://hatlonely.github.io/2018/01/24/golang字符串的几种连接方式/

原文地址:https://www.cnblogs.com/hatlonely/p/8343879.html

时间: 2024-10-17 21:31:36

golang 几种字符串的连接方式的相关文章

Oracle数据库服务器的两种连接方式

oracle提供了两种数据库连接方式,一种是专有连接方式,另一种是共享连接方式.区别在于专有连接方式是一个用户对应一个数据库服务器进程,而共享服务器连接方式是多个用户可以不定向轮流使用一个服务器进程.oracle推荐专有连接,一个session对应一个服务器进程,会减少竞争,对于较长事务很有用,但是会耗费PGA资源;共享连接方式对于事务执行时间短且服务器资源受限的系统是有利的.对于该使用哪种连接方式,自己权衡. 我们可以通过dbca设置数据库的连接方式: 当然我们也可以通过修改参数shared_

数据库之查询的连接方式

前言 在写开头的时候我想到了两个开始,比较一下 第一个开头:sql几种常见的查询连接方式 第二个开头:sql(结构化查询语言)有数据定义功能,数据查询功能,数据操作功能,数据控制功能.我们平常所说的增删改查就是sql这些功能的更加简洁的说法.现在就"查"来介绍几种常用的连接方式. 哪一种更好?我个人更加倾向于第二种.原因是第二种让我明确了我现在总结的知识在我的知识网中处于什么地方.让我的知识很有归属感.至于我为什么会想到第二种写法就要源于一趟课了. 在准备写这篇博客的过程中米老师给我们

JS中三种字符串连接方式及其性能比较

工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符“+”把要连接的字符串连起来: str="a"; str+="b"; 毫无疑问,这种方法是最便捷快速的,如果只连接100个以下的字符串建议用这种方法最方便. 第二种方法  以数组作为中介用 join 连接字符串: var arr=new Array(); arr.push(a); arr.push

python字符串连接方式有哪些

在python开发中,会经常用到python字符串http://www.maiziedu.com/group/article/10646/,在python字符串操作中常用的无外乎就是替换.删除.截取.复制.连接.比较.查询.分割等等,今天小编不给大家讲那么多,就单独讲讲python字符串连接的方式有哪些,今天在写代码,顺便总结一下: 最原始的字符串连接方式:str1 + str2 python 新字符串连接语法:str1, str2 奇怪的字符串方式:str1 str2 % 连接字符串:'nam

python字符串连接方式(转)

在python中有很多字符串连接方式,今天就在这里具体总结一下: ①.最原始的字符串连接方式:str1 + str2②.python 新字符串连接语法:str1, str2③.奇怪的字符串方式:str1 str2④.% 连接字符串:'name:%s; sex: ' % ('tom', 'male')⑤.字符串列表连接:str.join(some_list) 下面具体分析一下: 第一种,想必只要是有编程经验的人,估计都知道,直接用 "+" 来连接两个字符串: 'Jim' + 'Green

Python字符串连接方式

python中有很多字符串连接方式,总结一下: 1 最原始的字符串连接方式:str1 + str22 python 新字符串连接语法:str1, str23 奇怪的字符串方式:str1 str24 % 连接字符串:‘name:%s; sex: ’ % ('tom', 'male')5 字符串列表连接:str.join(some_list) 第一种,想必只要是有编程经验的人,估计都知道,直接用 “+” 来连接两个字符串: 'Jim' + 'Green' = 'JimGreen' 第二种比较特殊,如

Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有配套方法 6.缓存.重试 7.cookie支持session  id会话支持 8.弱网性能和稳定性 9.超时时间,几种超时时间   连接超时,响应超时 10.适配各种机型.4.4和之前版本  2.3  4.1 5.0 4种网络连接方式提供的功能对比表格: 缓存 重试 Https/Http 稳定性 C

iSCSI存储的3种连接方式

我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器.工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统. iSCSI设备的主机接口一般默认都是IP接口,可以直接与以太网络交换机和iSCSI交换机连接,形成一个存储区域网络.根据主机端HBA卡.网络交换机的不同,iSCSI设备与主机之间有三种连接方式. 第一种:以太网卡+initiator软件方式. 服务器.工作站等主机使用标准的以太网卡,通过以太网线直接与以太网交换机连接,iSCSI存储也通过以太网线连接到以

《转载》Apache HTTP Server 与 Tomcat 的三种连接方式介绍

本文转载自IBM developer 首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80. 既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢?原因有下面几个: 1. 提升对静态文件的处理性能 2. 利用