go 性能相关总结

Go语言性能测试与优化技巧
本文介绍了Go语言的性能测试基准概念,如ns/op,提供了进行性能测试的命令,并通过BenchmarkFmt和BenchmarkPlus的例子展示了如何比较不同操作的效率。文章还分享了一些Go语言的性能优化小点,如在循环中使用++i,使用"+"代替fmt.Sprintf,以及strconv包、strings.Join和预设容量的slice、map等的高效用法。

链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。
在这里插入图片描述
性能测试基本概念
基本概念
Benchmark: 性能测试

ns/op: 纳秒/每个操作,前面数值越小越快

命令
go test -c
go test -test.bench=. -test.cpuprofile=cpu.prof
go tool pprof bench.test cpu.prof
示例
建立一个包,创建一个test文件如,文件名为lib_test.go

package lib

import (
“testing”
“fmt”
)

const (
str = “hello gohpers!”
sep = “,”
)

func BenchmarkFmt(b *testing.B) {
for i := 0; i < b.N ; i++ {
_ = fmt.Sprintf("%s%s%s%s%s", str, sep, str, sep, str)
}

}

func BenchmarkPlus(b *testing.B) {
for i:=0; i < b.N; i++ {
_ = str + sep + str + sep + str
}
}
然后运行 go test -bench=. 后面这个参数"." 不能加引号

结果

// Benchmark 名字 - CPU 循环次数 平均每次执行时间
BenchmarkFmt-4 3000000 554 ns/op
BenchmarkPlus-4 2000000000 0.36 ns/op

结论: 0.36 更快一点
一些优化小点
在for循环中, ++i要比i++快, for逐渐减小要比逐渐增加快

使用 “+” 比使用fmt.Sprintf() 快

使用 strconv 包转换 要比 fmt.Sprintf 快

使用 strings.Join() 比 “+” 快

使用string.Join() 比 bytes.Buffer() 快

指定cap的slice 比不指定的快,指定的cap的map比不指定的快。slice 要比使用map快。

string 和 []byte
如果可以的话,尽量用多[]byte,少用string
尽可能少地在两者之间做转换

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值