[笔记]Go语言的字符串拼装方式性能对比
Go语言中字符串的拼装方法很多,那么问题来了,到底哪家性能好?
下面代码,分别比较了 fmt.Sprintf,string +,strings.Join,bytes.Buffer,方法是循环若干次比较总时间。
在VMWare下的Ubuntu 14.04下运行的结果表明:
- fmt.Sprintf 和 strings.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 := ; i < n; i++ {
- switch index {
- case : // fmt.Sprintf
- s = fmt.Sprintf("%s[%s]", s, v)
- case : // string +
- s = s + "[" + v + "]"
- case : // strings.Join
- s = strings.Join([]string{s, "[", v, "]"}, "")
- case : // temporary bytes.Buffer
- b := bytes.Buffer{}
- b.WriteString("[")
- b.WriteString(v)
- b.WriteString("]")
- s = b.String()
- case : // stable bytes.Buffer
- buf.WriteString("[")
- buf.WriteString(v)
- buf.WriteString("]")
- }
- if i == n- {
- if index == { // 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 :=
- d := []time.Duration{}
- for i := ; i < k; i++ {
- d[i] = benchmarkStringFunction(, i)
- }
- for i := ; i < k-; i++ {
- fmt.Printf("way %d is %6.1f times of way %d\n", i, float32(d[i])/float32(d[k-]), k-)
- }
- }
其中一次的结果如下:
- etworker@ubuntu:~/work/go/test$ go run testBenchmark.go
- time of way()=.199641573s
- time of way()=.716669ms
- time of way()=.197077483s
- time of way()=.277063ms
- time of way()=.398864ms
- way is 857.6 times of way
- way is 406.6 times of way
- way is 855.7 times of way
- way is 1.6 times of way
[笔记]Go语言的字符串拼装方式性能对比的更多相关文章
- [笔记]Go语言写文件几种方式性能对比
Go语言中写文件有多种方式,这里进行如下几种方式的速度对比: 打开文件,写入内容,关闭文件.如此重复多次 打开文件,写入内容,defer 关闭文件.如此重复多次 打开文件,重复多次写入内容,defer ...
- JS中字符串拼装 单双引号的处理 字符转义
js中可能会用到动态追加元素,可能数据也是从后台传过来的,当然有两种思路, 1.在后台拼装好直接返回; 2.在前台js里面拼装, 如果拼装大量的html时可能单双引号就容易出问题;那么如何解决呢?最近 ...
- SNMP学习笔记之Python的netsnmp和pysnmp的性能对比
0x00 概览 用python获取snmp信息有多个现成的库可以使用,其中比较常用的是netsnmp和pysnmp两个库.网上有较多的关于两个库的例子. 本文重点在于如何并发的获取snmp的数据,即同 ...
- JS下高效拼装字符串的几种方法比较与测试代码
在使用Ajax提交信息时,我可能常常需要拼装一些比较大的字符串通过XmlHttp来完成POST提交.尽管提交这样大的信息的做法看起来并不优雅,但有时我们可能不得不面对这样的需求.那么JavaScrip ...
- 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 ...
- JS 拼装代码的HTML onClick方法传递字符串
有时会在JS中拼装HTML代码,这时在HTML中出现的onClick()方法中: 1.出现传递Num型的数据,直接拼装进去即可: 2.可能会出现传递字符串的情况,处理方法比较特殊,如下: a:直接字符 ...
- 小程序开发笔记【二】,抽奖结果json数据拼装bug解决
抽奖结果数据json格式数据拼接bug,如下图,只发布了两个奖项,每个奖项设置2个奖品,但最后拼接数据的时候出现3个奖项 json数据格式如下 "luckyResult":[ { ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- C语言里字符串的解析
根据给定的字符串,按照一定规则解析字符串,卡住好几次,这次做个笔记,以供参考 函数名称: strtok 函数原型: char *strtok(char *s1, const char *s ...
随机推荐
- 档案 & 权限管理
1. owner, group, others root 是万能的天神 权限 连结档 owner group 容量 修改日期 档名 2. chown, chgrp, chmod chgrp –R ro ...
- head管理EC下载,配置启动
参考文档:https://blog.csdn.net/yx1214442120/article/details/55102298
- 修改net基本三层 动软生产
控制层(dal) 模型层-实体类(Model) 显示层-web
- CVPR(IEEE Conference on Computer Vision and Pattern Recognition)
论文提交时间:11月份中旬左右会议时间:7月份左右 CVPR 2017: 网址:http://cvpr2017.thecvf.com/ 接受论文数:782
- 【watcher】 #02 c# 中实现时间戳等,日期数字及大概率绝对随机数 实现
在Wacher的项目中,用到了很多时间记录的地方,为了将来能够和在线数据打通,我们使用了时间戳来记录时间信息 由于c# 没有现成的方法,所以我们重新写了一个Helper类来帮助我们使用这些公共函数 同 ...
- (转)SQL执行顺序
SQL语句理解:http://blog.jobbole.com/55086/ 窗口函数/分析函数:http://blog.csdn.net/mfkpie/article/details/1636451 ...
- XStream的基本使用
先准备两个bean public class Book { private int bookId; private String bookName; private String bookCode; ...
- js转译html标签
api返回的接口数据是这样的"<div>测试数据</div>" js拼接html时会过滤掉<div></div> 所以需要对< ...
- JavaScript文件操作(1)-基础
http://www.iunbug.com/archives/2012/06/04/208.html
- angualar入门学习-- 自定义指令 认识属性
个AngularJS指令在HTML代码中可以有四种表现形式: 1.作为一个新的HTML元素来使用 2.作为一个元素的属性来使用 3.作为一个元素的类来使用 4.作为注释来使用 一.创建指令 angul ...