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

下面代码,分别比较了 fmt.Sprintf,string +,strings.Join,bytes.Buffer,方法是循环若干次比较总时间。

在VMWare下的Ubuntu 14.04下运行的结果表明:

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

测试代码如下:

  1. package main
  2.  
  3. import (
  4. "bytes"
  5. "fmt"
  6. "strings"
  7. "time"
  8. )
  9.  
  10. func benchmarkStringFunction(n int, index int) (d time.Duration) {
  11. v := "ni shuo wo shi bu shi tai wu liao le a?"
  12. var s string
  13. var buf bytes.Buffer
  14.  
  15. t0 := time.Now()
  16. for i := ; i < n; i++ {
  17. switch index {
  18. case : // fmt.Sprintf
  19. s = fmt.Sprintf("%s[%s]", s, v)
  20. case : // string +
  21. s = s + "[" + v + "]"
  22. case : // strings.Join
  23. s = strings.Join([]string{s, "[", v, "]"}, "")
  24. case : // temporary bytes.Buffer
  25. b := bytes.Buffer{}
  26. b.WriteString("[")
  27. b.WriteString(v)
  28. b.WriteString("]")
  29. s = b.String()
  30. case : // stable bytes.Buffer
  31. buf.WriteString("[")
  32. buf.WriteString(v)
  33. buf.WriteString("]")
  34. }
  35.  
  36. if i == n- {
  37. if index == { // for stable bytes.Buffer
  38. s = buf.String()
  39. }
  40. fmt.Println(len(s)) // consume s to avoid compiler optimization
  41. }
  42. }
  43. t1 := time.Now()
  44. d = t1.Sub(t0)
  45. fmt.Printf("time of way(%d)=%v\n", index, d)
  46. return d
  47. }
  48.  
  49. func main() {
  50. k :=
  51. d := []time.Duration{}
  52. for i := ; i < k; i++ {
  53. d[i] = benchmarkStringFunction(, i)
  54. }
  55.  
  56. for i := ; i < k-; i++ {
  57. fmt.Printf("way %d is %6.1f times of way %d\n", i, float32(d[i])/float32(d[k-]), k-)
  58. }
  59. }

其中一次的结果如下:

  1. etworker@ubuntu:~/work/go/test$ go run testBenchmark.go
  2.  
  3. time of way()=.199641573s
  4.  
  5. time of way()=.716669ms
  6.  
  7. time of way()=.197077483s
  8.  
  9. time of way()=.277063ms
  10.  
  11. time of way()=.398864ms
  12. way is 857.6 times of way
  13. way is 406.6 times of way
  14. way is 855.7 times of way
  15. way is 1.6 times of way

[笔记]Go语言的字符串拼装方式性能对比的更多相关文章

  1. [笔记]Go语言写文件几种方式性能对比

    Go语言中写文件有多种方式,这里进行如下几种方式的速度对比: 打开文件,写入内容,关闭文件.如此重复多次 打开文件,写入内容,defer 关闭文件.如此重复多次 打开文件,重复多次写入内容,defer ...

  2. JS中字符串拼装 单双引号的处理 字符转义

    js中可能会用到动态追加元素,可能数据也是从后台传过来的,当然有两种思路, 1.在后台拼装好直接返回; 2.在前台js里面拼装, 如果拼装大量的html时可能单双引号就容易出问题;那么如何解决呢?最近 ...

  3. SNMP学习笔记之Python的netsnmp和pysnmp的性能对比

    0x00 概览 用python获取snmp信息有多个现成的库可以使用,其中比较常用的是netsnmp和pysnmp两个库.网上有较多的关于两个库的例子. 本文重点在于如何并发的获取snmp的数据,即同 ...

  4. JS下高效拼装字符串的几种方法比较与测试代码

    在使用Ajax提交信息时,我可能常常需要拼装一些比较大的字符串通过XmlHttp来完成POST提交.尽管提交这样大的信息的做法看起来并不优雅,但有时我们可能不得不面对这样的需求.那么JavaScrip ...

  5. Yii2查询之where条件拼装

    目录 1 语法 2 哈希格式 3 运算符格式 3.1 对比 3.2 and 3.3 or 3.4 not 3.5 between和not between 3.6 in和not in 3.7 like ...

  6. JS 拼装代码的HTML onClick方法传递字符串

    有时会在JS中拼装HTML代码,这时在HTML中出现的onClick()方法中: 1.出现传递Num型的数据,直接拼装进去即可: 2.可能会出现传递字符串的情况,处理方法比较特殊,如下: a:直接字符 ...

  7. 小程序开发笔记【二】,抽奖结果json数据拼装bug解决

    抽奖结果数据json格式数据拼接bug,如下图,只发布了两个奖项,每个奖项设置2个奖品,但最后拼接数据的时候出现3个奖项 json数据格式如下 "luckyResult":[ { ...

  8. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  9. C语言里字符串的解析

      根据给定的字符串,按照一定规则解析字符串,卡住好几次,这次做个笔记,以供参考 函数名称:   strtok 函数原型:   char *strtok(char *s1, const char *s ...

随机推荐

  1. 档案 & 权限管理

    1. owner, group, others root 是万能的天神 权限 连结档 owner group 容量 修改日期 档名 2. chown, chgrp, chmod chgrp –R ro ...

  2. head管理EC下载,配置启动

    参考文档:https://blog.csdn.net/yx1214442120/article/details/55102298

  3. 修改net基本三层 动软生产

    控制层(dal) 模型层-实体类(Model) 显示层-web

  4. CVPR(IEEE Conference on Computer Vision and Pattern Recognition)

    论文提交时间:11月份中旬左右会议时间:7月份左右 CVPR 2017: 网址:http://cvpr2017.thecvf.com/ 接受论文数:782

  5. 【watcher】 #02 c# 中实现时间戳等,日期数字及大概率绝对随机数 实现

    在Wacher的项目中,用到了很多时间记录的地方,为了将来能够和在线数据打通,我们使用了时间戳来记录时间信息 由于c# 没有现成的方法,所以我们重新写了一个Helper类来帮助我们使用这些公共函数 同 ...

  6. (转)SQL执行顺序

    SQL语句理解:http://blog.jobbole.com/55086/ 窗口函数/分析函数:http://blog.csdn.net/mfkpie/article/details/1636451 ...

  7. XStream的基本使用

    先准备两个bean public class Book { private int bookId; private String bookName; private String bookCode; ...

  8. js转译html标签

    api返回的接口数据是这样的"<div>测试数据</div>" js拼接html时会过滤掉<div></div> 所以需要对< ...

  9. JavaScript文件操作(1)-基础

    http://www.iunbug.com/archives/2012/06/04/208.html

  10. angualar入门学习-- 自定义指令 认识属性

    个AngularJS指令在HTML代码中可以有四种表现形式: 1.作为一个新的HTML元素来使用 2.作为一个元素的属性来使用 3.作为一个元素的类来使用 4.作为注释来使用 一.创建指令 angul ...