文档章节

Golang 字符串连接性能探究

sheepbao
 sheepbao
发布于 2016/12/12 23:29
字数 340
阅读 503
收藏 1
点赞 0
评论 3

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
博文 15
码字总数 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 ⋅ 0

go语言文件汇总

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

d_watson ⋅ 2016/04/15 ⋅ 2

golang操作Redis(redigo基础篇)

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

gotaly ⋅ 2014/08/21 ⋅ 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

Golang实现的高性能HTTP负载工具

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

lubia ⋅ 2013/11/19 ⋅ 0

golang VS php 性能对比

原文 http://www.isno.cn/2013/12/golang-vs-php/ 在工作的项目中,我的主要开发语言是php,因需求或者为弥补php的缺陷,需要为php做各种各样的扩展,比如php本身不支持线程,没有队列,进程也...

神仙 ⋅ 2013/12/19 ⋅ 33

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 ⋅ 0

[每日一题]对比Java中的String、StringBuffer、StringBuilder

今天来个简单的题目,轻松一下:) 相信很多人对这个问题都不陌生,只要是个Java程序员,肯定就用过这几个类:1、String是个不可变对象,这就意味着每次字符串拼接都是创建了新的实例2、Str...

UlricQin ⋅ 2014/09/25 ⋅ 0

NOSQL数据库--xuncache

xuncache 是免费开源的NOSQL(内存数据库) 采用golang开发,简单易用而且 功能强大(就算新手也完全胜任)、性能卓越能轻松处理海量数据,可用于缓存系统. 目前版本 version 0.3 前期它是活跃的 ...

孙彦欣 ⋅ 2013/04/08 ⋅ 3

回复:《golang VS php 性能对比》

连接:http://www.oschina.net/question/29420_138135 看到有一篇博文介绍Golang与PHP性能对比,在此回复一下。这测试结果明显是误导人的。 1,PHP未开启OpCache,那么每次都要读磁盘文件。并...

matyhtf ⋅ 2014/10/22 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 19分钟前 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 22分钟前 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 23分钟前 ⋅ 0

IT行业的变革就像世界杯德国对战墨西哥一样难以预测[图]

最近在观看世界杯,尤其是昨天的比赛,上一届卫冕冠军德国队居然0:1告负墨西哥,这创造了历史,首先是墨西哥从来没赢过德国队,其次是德国队36年来首站没输过,再差也是打平,而这次,德国队...

原创小博客 ⋅ 42分钟前 ⋅ 0

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 52分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部