文档章节

Golang 字符串拼装方式性能对比

吃一堑消化不良
 吃一堑消化不良
发布于 2017/05/15 19:41
字数 387
阅读 214
收藏 1

Go语言中字符串的拼装方法很多,那么问题来了,到底哪家性能好?

下面代码,分别比较了 fmt.Sprintfstring +strings.Joinbytes.Buffer,方法是循环若干次比较总时间。在VMWare下的Ubuntu 14.04下运行的结果如下,仅供参考:

  • fmt.Sprintfstrings.Join 速度相当
  • string + 比上述二者快一倍
  • bytes.Buffer又比上者快约400-500倍
  • 如果循环内每次都临时声明一个bytes.Buffer来使用,会比持续存在慢50%,但是仍然很快

测试代码如下:

package main

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

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: // temporary bytes.Buffer
            b := bytes.Buffer{}
            b.WriteString("[")
            b.WriteString(v)
            b.WriteString("]")
            s = b.String()
        case 4: // stable bytes.Buffer
            buf.WriteString("[")
            buf.WriteString(v)
            buf.WriteString("]")
        }

        if i == n-1 {
            if index == 4 { // for stable bytes.Buffer
                s = buf.String()
            }
            fmt.Println(len(s)) // consume s to avoid compiler optimization
        }
    }
    t1 := time.Now()
    d = t1.Sub(t0)
    fmt.Printf("time of way(%d)=%v\n", index, d)
    return d
}

func main() {
    k := 5
    d := [5]time.Duration{}
    for i := 0; i < k; i++ {
        d[i] = benchmarkStringFunction(10000, i)
    }

    for i := 0; i < k-1; i++ {
        fmt.Printf("way %d is %6.1f times of way %d\n", i, float32(d[i])/float32(d[k-1]), k-1)
    }
}

其中一次的结果如下:

410000
time of way(0)=1.199641573s
410000
time of way(1)=568.716669ms
410000
time of way(2)=1.197077483s
41
time of way(3)=2.277063ms
410000
time of way(4)=1.398864ms
way 0 is  857.6 times of way 4
way 1 is  406.6 times of way 4
way 2 is  855.7 times of way 4
way 3 is    1.6 times of way 4

 

本文转载自:http://studygolang.com/articles/2507

吃一堑消化不良
粉丝 28
博文 188
码字总数 112947
作品 0
浦东
程序员
私信 提问
聊一聊前端模板与渲染那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): http://my.oschina.net/MrHou/blog?catalog=477313&temp=1466755903794 1 页面级的渲染...

侯禹
2016/07/02
655
0
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
2018/01/15
12
0
golang 高效字符串拼接

golang 高效字符串拼接 It event poll2016-03-28545 阅读 golang字符串 虽然方便,但是使用+=操作符并不是在一个循环中往字符串末尾追加字符串最有效的方式。 一个有效的方式是准备好一个字符...

It event poll
2016/03/28
0
0
golang VS php 性能对比

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

神仙
2013/12/19
28.2K
34
Golang实现的高性能HTTP负载工具

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

lubia
2013/11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
26分钟前
2
0
Java设计模式之外观模式(门面模式)

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口...

须臾之余
43分钟前
4
0
mysql免安装版,服务无法启动没有抱任何错误

1.解压 2.新建my.ini [mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70% of total RAM for dedicated server, e......

榴莲黑芝麻糊
今天
2
0
Qt编写安防视频监控系统3-通道交换

一、前言 最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡还很慢,毕竟...

飞扬青云
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部