go 性能相关总结
博客专区 > solate 的博客 > 博客详情
go 性能相关总结
solate 发表于11个月前
go 性能相关总结
  • 发表于 11个月前
  • 阅读 27
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

性能测试基本概念

基本概念

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 更快一点

一些优化小点

  1. 在for循环中, ++i要比i++快, for逐渐减小要比逐渐增加快

  2. 使用 "+" 比使用fmt.Sprintf() 快

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

  4. 使用 strings.Join() 比 "+" 快

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

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

string 和 []byte

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

后续继续补充

参考

Go 语言测试(Test)、性能测试(Benchmark) 学习笔记

PS: 觉得不错的请点个赞吧!! (ง •̀_•́)ง

标签: go Benchmark
共有 人打赏支持
粉丝 5
博文 97
码字总数 76096
×
solate
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: