非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第15章 Go命令行工具
- 15.6 性能分析
- 15.6.2 通过文件方式
- 15.6.3 通过HTTP方式
- 15.7 小结
第15章 Go命令行工具
15.6 性能分析
15.6.2 通过文件方式
为了能分析Go程序的性能,我们需要在程序中导入runtime/pprof来生成性能分析所需要的profile文件。
pprof包提供了StartCPUProfile(w io.Writer)接口来输出CPU性能参数到文件中。
如下是针对CPU的性能参数获取代码:
f, _ := os.Create("cpu_file.prof")
// 开始cpu profile,结果写到文件f中
pprof.StartCPUProfile(f)
// 结束profile
defer pprof.StopCPUProfile()
对于内存堆栈可以使用pprof包的WriteHeapProfile(w io.Writer)接口,用法和StartCPUProfile类似,这里就不举例了。
[ 动手写15.6.1 ]
package main
import (
"fmt"
"os"
"runtime/pprof"
)
const Num int = 10000
func main() {
f, _ := os.Create("cpu_file.prof")
// 开始cpu profile, 结果写到文件f 中
pprof.StartCPUProfile(f)
// 结束profile
defer pprof.StopCPUProfile()
var str string
for i := 0; i < Num; i++ {
str = fmt.Sprintf("%s%d", str, i)
}
}
运行动手写15.6.1后会在当前路径下生成cpu_file.prof文件,
这时我们就可使用go tool pprof + cpu.prof工具对整个文件进行性能分析。
> go tool pprof cpu_file.prof
top命令的作用是输出最耗时的十处代码,可以发现runtime.procyield操作最耗时,由于这个函数是标准库runtime中的代码,我们无法对其进行代码优化,这时我们可以对main.main进行分析,使用list命令就可以查看费时的代码在哪一行。
list main.main
分析得知第24行代码fmt.Sprintf耗时最多,花费了20 ms,我们就可以针对这里的逻辑进行优化,使用其他方式的字符串连接。
不仅如此,我们还可以使用web命令来查看图形界面的程序执行流程,
当然这个东西在不同的机器上 跑结果可能不一样,毕竟都是 性能分析了,所以知道咋用 就OK了
15.6.3 通过HTTP方式
通过文件的方式我们可以对大部分cli程序进行性能分析,但如果是Web程序,上述方法就有点捉襟见肘了。
Go语言给我们提供了另一个针对Web程序的实时性能分析方式,只需要使用匿名导入的方式引入如下包并启动HTTP服务器即可。
import _ "net/http/pprof"
[ 动手写 15.6.2 ]
package main
import (
"fmt"
"log"
"net/http"
_ "net/http/pprof"
)
const Num int = 10000
func concat_str(writer http.ResponseWriter, request *http.Request) {
var str string
for i := 0; i < Num; i++ {
str = fmt.Sprintf("%s%d", str, i)
}
}
func main() {
http.HandleFunc("/str", concat_str)
log.Fatal(http.ListenAndServe(":8080", nil))
}
动手写15.6.2在本地127.0.0.1的8080端口开启了一个HTTP服务器,并注册了一个/str路由,
浏览器只要访问http:// 127.0.0.1:8080/str,就会执行concat_str函数。
由于我们导入了net/http/pprof包,在浏览器访问如下地址,就可以看到相关的性能参数。
http://127.0.0.1:8080/debug/pprof
使用如下命令对CPU性能进行分析:
go tool pprof http://127.0.0.1:8080/debug/pprof/profile?seconds=5
pprof工具会等待5秒,持续获取这5秒内的CPU运行状况,默认seconds参数为30秒,运行后就需要在这5秒内持续访问http:// 127.0.0.1:8080/str来获取concat_str的CPU性能参数。
至此,分析性能的方式和通过文件的方式一致。
15.7 小结
- go run/build可以方便我们构建系统,计算文件的依赖关系,然后调用编译器、汇编器和连接器构建程序。
- go get/install可以获取安装远程代码,方便包管理。
- go fmt能以Go语言编码标准来格式化我们写的代码。
- go doc可以从注释中生成文档并展示出来。
- go test可用来进行代码测试、覆盖率测试。
- go tool pprof可用来对程序进行性能测试。
- 熟练掌握Go语言工具能很大程度地提高我们的编码效率。