文档章节

Golang 字符串连接性能探究

sheepbao
 sheepbao
发布于 2016/12/12 23:29
字数 340
阅读 519
收藏 1

Golang 字符串连接性能探究

标签(空格分隔): golang


为何探究

几乎所有的软件项目,不管是什么语言,都会用到处理字符串,而拼接字符是最基本,也最常用的。一般连接字符串都有好几种方式,不同的方式适合不同的场景,此次仅探究如果快速动态连接大量的字符串。

相关问题

  1. https://gocn.io/question/265&sort_key=agree_count&sort=DESC
  2. http://stackoverflow.com/questions/1760757/how-to-efficiently-concatenate-strings-in-go/23857998

探究的代码

还是代码最明了

package main

import (
    "bytes"
    "fmt"
    "strings"
    "time"
)

var way map[int]string

func benchmarkStringFunction(n int, index int) (d time.Duration) {
    v := "ni shuo wo shi bu shi tai wu liao le a?"
    var s string
    var buf bytes.Buffer

    t0 := time.Now()
    for i := 0; i < n; i++ {
        switch index {
        case 0: // fmt.Sprintf
            s = fmt.Sprintf("%s[%s]", s, v)
        case 1: // string +
            s = s + "[" + v + "]"
        case 2: // strings.Join
            s = strings.Join([]string{s, "[", v, "]"}, "")
        case 3: // stable bytes.Buffer
            buf.WriteString("[")
            buf.WriteString(v)
            buf.WriteString("]")
        }

    }
    d = time.Since(t0)
    if index == 3 {
        s = buf.String()
    }
    fmt.Printf("string len: %d\t", len(s))
    fmt.Printf("time of [%s]=\t %v\n", way[index], d)
    return d
}

func main() {
    way = make(map[int]string, 5)
    way[0] = "fmt.Sprintf"
    way[1] = "+"
    way[2] = "strings.Join"
    way[3] = "bytes.Buffer"

    k := 4
    d := [5]time.Duration{}
    for i := 0; i < k; i++ {
        d[i] = benchmarkStringFunction(10000, i)
    }
}
结果:
string len: 410000     time of [fmt.Sprintf]=   426.001476ms                                                      
string len: 410000     time of [+]=     307.044147ms                                                              
string len: 410000     time of [strings.Join]=  738.44362ms                                                       
string len: 410000     time of [bytes.Buffer]=  742.248µs   

结果

结果很明显:

  • strings.Join 最慢
  • fmt.Sprintf 和 string + 差不多
  • bytes.Buffer又比上者快约500倍

© 著作权归作者所有

共有 人打赏支持
sheepbao

sheepbao

粉丝 7
博文 18
码字总数 16873
作品 1
深圳
后端工程师
加载中

评论(3)

chenwenli
chenwenli
buffer的write用byte 传入 会更快~~
sheepbao
sheepbao

引用来自“_V_Terry_”的评论

if index == 3 {
s = buf.String()
}
如果这个放到 case 3 执行内容里面, 会发现, 时间消耗和case 1差不多.

string len: 410000 time of [fmt.Sprintf]= 561.127205ms
string len: 410000 time of [+]= 385.979767ms
string len: 410000 time of [strings.Join]= 965.835983ms
string len: 410000 time of [bytes.Buffer]= 377.64171ms
放到case 3的话,每次执行都要进行byte转string了
_V_Terry_
_V_Terry_
if index == 3 {
s = buf.String()
}
如果这个放到 case 3 执行内容里面, 会发现, 时间消耗和case 1差不多.

string len: 410000 time of [fmt.Sprintf]= 561.127205ms
string len: 410000 time of [+]= 385.979767ms
string len: 410000 time of [strings.Join]= 965.835983ms
string len: 410000 time of [bytes.Buffer]= 377.64171ms
PHP7、swoole、Golang的webserver并发性能对比

在我的本地机器上,都是请求输出同样字符串的页面。都是输出"yoyo"字符串 测试: ab -n10000 -c100 url golang 1.9.2 结果报告: QPS达到5333.83 PHP7.1.5+swoole2.0.12 结果报告: QPS达到129...

oneHand
01/15
12
0
Golang实现的高性能HTTP负载工具

Sniper Sniper是一个功能强大、高性能的HTTP负载工具,采用Golang编写。利用协程并发优势,实现海量并发、超低内存占用、丰富图表展示。是测试、分析、优化服务端性能的绝佳助手! 体验 提供以...

lubia
2013/11/19
0
0
go语言文件汇总

归并排序及go语言实现 堆排序算法及go语言实现 Go语言基础学习(一)变量 【Leetcode】:Counting Bits问题 in Go语言 基于go语言的心跳响应 【Leetcode】:Single Number III问题 in Go语言 ...

d_watson
2016/04/15
127
2
golang操作Redis(redigo基础篇)

现在的redis大红大紫,而且很多应用场景都适合使用Reids来做缓存或者直接做存储,典型的如mysql前端缓存、手游里面的排行榜等。那么我们怎样用golang来操作redis呢? 熟悉redis的同学,肯定第...

gotaly
2014/08/21
0
0
Golang、python中的字符串、slice、list性能研究。

1:在go语言中,先来看创建slice的性能分析,我们知道slice有append这个功能 t := time.Now()m := []string{}for i := 0; i < 1000000; i++ { }fmt.Println(time.Now().Sub(t)) 可以看到添加......

大洋的顶端
2017/03/29
74
0

没有更多内容

加载失败,请刷新页面

加载更多

网站优化技术包括哪些内容

网站优化Incapsula超越简单的内容缓存,可以优化网站性能或应用程序的用户体验,优化包括内容缩小、动态文件压缩、图像压缩、会话重用优化、TCP优化和连接预合并。 动态文件压缩,普通的web...

上树的熊
19分钟前
1
0
业界 | Teradata全球调研:四分之三企业分析项目数据科学家“缺货”

当地时间10月15日,2018 Teradata全球用户大会在美国拉斯维加斯举行。来自15个国家的3000多位数据人参与了本次峰会。 大会第一日,Teradata发布了针对“企业数据分析”的2018年调研结果。 调...

Mr_zebra
20分钟前
1
0
java 通过Unsafe不使用构造器直接创建对象

这里有一个User没有无参构造 public class User { static { System.out.println("static {}"); } { System.out.println("{}"); } public User(Strin......

ValSong
21分钟前
1
0
eureka 高可用配置 unavailable-replicas 问题.

在使用spring cloud 配置eureka 高可用配置时.发现配置的节点一直无法获取心跳. eureka控制台界面上一直显示的挂载节点 是 unavailable-replicas 查看日志.就是获取心跳的地址不对. 默认的健...

拖鞋莫止步
22分钟前
1
0
Vue2 模板template的四种写法

<div id="app">    <h1>我是直接写在构造器里的模板1</h1></div> <template id="demo3">    <h1 style="color:red">我是选项模板3</h1></template> <script type="x-t......

粒子数反转
22分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部