文档章节

Golang 字符串连接性能探究

sheepbao
 sheepbao
发布于 2016/12/12 23:29
字数 340
阅读 510
收藏 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
go语言文件汇总

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

d_watson
2016/04/15
127
2
Golang实现的高性能HTTP负载工具

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

lubia
2013/11/19
0
0
golang操作Redis(redigo基础篇)

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

gotaly
2014/08/21
0
0
Golang资料集

该资源的github地址:Qix 《Platform-native GUI library for Go》 介绍:跨平台的golang GUI库,支持Windows(xp以上),Unix,Mac OS X(Mac OS X 10.7以上) 《Gopm 快速入门》 介绍:Gopm(Go 包管...

ty4z2008
2016/03/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python标准输入输出

input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘。 input 可以接收一个Python表达式作为输入,并将运算结果返回。 print()和format()输出 format()输出...

colinux
22分钟前
0
0
Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a...

代码打碟手
34分钟前
0
0
PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。 但今天,我...

宇润
51分钟前
1
0
memcached命令行及其用法

21.5 memcached命令行 创建数据 yum install -y telnet 利用telnet命令连接memcached数据库 telnet 127.0.0.1 11211 #写入数据 set key2 0 30 212STORED 这个是错误的示范,因为0 30 已经...

lyy549745
51分钟前
0
0
Maven私服

Maven私服 一、简介 当多人项目开发的时候,尤其聚合项目开发,项目和项目之间需要有依赖关系,通过maven私服,可以保存互相依赖的jar包,这样的话就可把多个项目整合到一起。 如下图: Inst...

星汉
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部