当前位置: 首页 > news >正文

非零基础自学Golang 第15章 Go命令行工具 15.6 性能分析 15.6.2 通过文件方式 15.6.3 通过HTTP方式 15.7 小结

非零基础自学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语言工具能很大程度地提高我们的编码效率。

相关文章:

  • 单机模拟主从复制(一主三从)
  • 【vue设计与实现】编译器 - AST的转换
  • 高通 OpenXR SDK 使用指南(2)
  • middlebury立体匹配评估使用方法总结(三)——线上版教程
  • 软件产品登记前需要准备什么
  • 力扣刷题笔记day7(数组中重复的数字+在排序数组中查找数字+0~n-1中缺失的数字)
  • Windows下安装VTK8.2.0
  • 带你读AI论文丨针对文字识别的多模态半监督方法
  • Docker的常规操作使用
  • 多兴趣建模中兴趣向量多样性度量
  • Java中的序列化
  • 构建高性能内存队列:Disruptor
  • 仪表盘读数识别检测 Python+yolov5
  • Ubuntu: Docker安装与操作
  • 大数据基础平台搭建-(一)基础环境准备
  • HEVC学习之CTU划分
  • IHRM0728 项目参数化框架
  • java微信支付v3系列——2.微信支付基本配置
  • 【JavaEE】Servlet
  • Node基础——认识Node