go json int转化string_go 调优之火焰图

本文介绍了如何使用Go语言内置的pprof工具生成火焰图,通过火焰图来直观地查看程序中耗时的函数,从而进行性能优化。首先,引入net/http/pprof包并启动HTTP服务,然后通过`go tool pprof`命令获取CPU profile文件,最后使用graphviz工具将profile转换为可交互的火焰图。通过这一过程,开发者可以定位并优化性能瓶颈,提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

火焰图(flame graphs)是一种程序函数调用栈深度和耗时比例直观可交互展示的工具。

一图胜千言

7be23870dc4136bdb95bee648b03d6a9.png

如上图展示,火焰图展示程序中被频繁调用的函数和耗时占比。这边展示的是一章截图,原图是svg是可交互的,比如我们想具体看某个函数中子函数的情况你可以点击那个函数。结果如下

bb64eab3cc21d4717eec7fe4516649ba.png

在go生态中,早期我们经常会用github.com/uber-archive/go-torch来生成这样的图。从go1.11后 go tool pprof 就已经集成了这个功能,非常方便我们使用。

演示代码

package mainimport ("encoding/json""fmt""net/http"_ "net/http/pprof""time")func fn1() {b := fn2()fmt.Println(fn3(b))}func fn2() (b []byte) {b, _ = json.Marshal(map[string]int{"a":  22,"bb": 333,})return}func fn3(b []byte) int {var m map[string]intjson.Unmarshal(b, &m)if len(m) > 0 {return m["a"]}return 0}func main() {go func() {for {fn1()time.Sleep(1e8)}}()panic(http.ListenAndServe(":8080", nil))}

如上面代码所示,需要在代码中引入_ "net/http/pprof" ,然后需要启一个http服务 http.ListenAndServe(":8080", nil),就这样比较少的代码侵入。

运行

$ go run main.go

然后你可以在浏览器中访问,http://localhost:8080/debug/pprof/

看到如下的信息

/debug/pprof/Types of profiles available:CountProfile1allocs0block0cmdline5goroutine1heap0mutex0profile7threadcreate0trace...

ok 测试程序没问题了

生成火焰图

step 1

运行如下的命令,下载profile文件

go tool pprof http://127.0.0.1:8080/debug/pprof/profile -seconds 5

step 2

运行如下命令生成火焰图

go tool pprof -http=:8081 ~/pprof/pprof.main.samples.cpu.001.pb.gz

注意:这个时候可能会提升缺少 graphviz ubuntu和debian 使用 apt-get install graphviz 安装

用浏览器访问 http://localhost:8081/ui/flamegraph这个时候就能看到火焰图了。

调优过程

我们生成火焰图的目录是为了直观的发现程序中最耗时的函数,然后想办法去优化它, 优化后继续生成火焰图看是否有效果,然后再去发现下一个最耗时的函数,重复上面的步骤直到整个程序达到你满意的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值