用于分析的第三方包

在这小节,您将看到一个设置分析环境的第三方包的使用,它比使用 runtime/pprof 标准包方便很多。这在 betterProfile.go 中有所体现,将分三部分来介绍。

betterProfile.go 的第一部分如下:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/pkg/profile"
  5. )
  6. var VARIABLE int
  7. func N1(n int) bool {
  8. for i := 2 ; i < n; i++ {
  9. if (n % i) == 0 {
  10. return false
  11. }
  12. }
  13. return true
  14. }

这段代码,您能看到使用了第三方包,在 github.com/pkg/profile。您可以在 go get 命令的帮助下下载它,如下:

  1. $ go get github.com/pkg/profile

betterProfile.go 的第二段代码如下:

  1. func Multiply(a, b int) int {
  2. if a == 1 {
  3. return b
  4. }
  5. if a == 0 || b == 0 {
  6. return 0
  7. }
  8. if a < 0 {
  9. return -Multiply(-a, b)
  10. }
  11. return b + Multiply(a-1, b)
  12. }
  13. func main() {
  14. defer profile.Start(profile.ProfilePath("/tmp")).Stop()

这个由 Dave Cheney 开发的 github.com/pkg/profile 包需要您插入一行声明来开启 CPU 分析 在您的 Go 应用中。如果您想开启 内存分析的话,您应该插入如下声明来代替:

  1. defer profile.Start(profile.MemProfile).Stop()

这个程序余下代码如下:

  1. total := 0
  2. for i := 2; i < 200000; i++ {
  3. n := N1(i)
  4. if n {
  5. total++
  6. }
  7. fmt.Println("Total: ", total)
  8. }
  9. total = 0
  10. for i := 0; i < 5000; i++ {
  11. for j := 0; j < 400; j++ {
  12. k := Multiply(i, j)
  13. VARIABLE = k
  14. total++
  15. }
  16. }
  17. fmt.Println("Total: ", total)
  18. }

执行 betterProfile.go 产生如下输出:

  1. $ go run betterProfile.go
  2. 2018/03/08 17:01:28 profile: cpu profiling enabled, /tmp/cpu.pprof
  3. Total: 17984
  4. Total: 2000000
  5. 2018/03/08 17:01:56 profile: cpu profiling disabled, /tmp/cpu.pprof

*`github.com/pkg/profile` 包帮您完成数据捕获部分;与之前的处理一样!*

11.5.3 用于分析的第三方包 - 图2