Golang 字符串连接性能探究
博客专区 > sheepbao 的博客 > 博客详情
Golang 字符串连接性能探究
sheepbao 发表于10个月前
Golang 字符串连接性能探究
  • 发表于 10个月前
  • 阅读 477
  • 收藏 1
  • 点赞 0
  • 评论 3

腾讯云实验室 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倍
标签: golang 性能
共有 人打赏支持
sheepbao
粉丝 7
博文 15
码字总数 16873
作品 1
评论 (3)
_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
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了
chenwenli
buffer的write用byte 传入 会更快~~
×
sheepbao
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: