前面 2 篇 golang 性能优化分析系列文章:

一、基准测试 benchmark 简介

在 golang 中,可以通过 benchmark 基准测试来测试代码性能。基准测试主要是通过测试 cpu 和内存的效率问题,来评估被测试代码的性能。

基准测试的指标:

  1. 程序所花费的时间
  2. 内存使用的情况
  3. cpu 使用情况

基准测试文件名和函数规定:

  • go 基准测试文件都是以 _test.go 结尾,和单元测试用例在同一个文件中。
  • 基准测试每个函数都是以 Benchmark 开头。

基准测试常用命令:

  1. go test ./fib // 不进行基准测试,对 fib 进行单元测试
  2. go test -bench=. -run=none // 进行基准测试,不进行单元测试,-run 表示执行哪些单元测试和测试函数,一般函数名不会是 none,所以不执行单元测试
  3. // 上面的测试命令还可以用空格隔开,意义是一样
  4. go test -bench . -run none
  5. go test -bench=. // 对所有的进行基准测试
  6. go test -bench='fib$' // 只运行以 fib 结尾的基准测试,-bench 可以进行正则匹配
  7. go test -bench=. -benchtime=6s // 基准测试默认时间是 1s,-benchtime 可以指定测试时间
  8. go test -bench=. -benchtime=50x // 参数 -benchtime 除了指定时间,还可以指定运行的次数
  9. go test -bench=. -benchmem // 进行时间、内存的基准测试

说明:上面的命令中,-bench 后面都有一个 . ,这个点并不是指当前文件夹,而是一个匹配所有测试的正则表达式。

更多参数说明请查看帮助:go help testflag

分析基准测试数据:

  • cpu 使用分析:-cpuprofile=cpu.pprof
  • 内存使用分析:-benchmem -memprofile=mem.pprof
  • block分析:-blockprofile=block.pprof

在配合 pprof 就可以进行分析。

运行命令采样数据:

  1. go test -bench=. -run=none -benchmem -memprofile=mem.pprof
  2. go test -bench=. -run=none -blockprofile=block.pprof
  3. go test -bench=. -run=none -benchmem -memprofile=mem.pprof -cpuprofile=cpu.pprof

二、代码示例

2.1 代码示例

fib.go:

  1. package main
  2. func Fib(n int) int {
  3. if n < 2 {
  4. return n
  5. }
  6. return Fib(n-1) + Fib(n-2)
  7. }

fib_test.go:

  1. package main
  2. import (
  3. "testing"
  4. )
  5. func BenchmarkFib(b *testing.B) {
  6. // 运行 Fib 函数 b.N 次
  7. for n := 0; n < b.N; n++ {
  8. Fib(20)
  9. }
  10. }
  11. func BenchmarkFib2(b *testing.B) {
  12. // 运行 Fib 函数 b.N 次
  13. for n := 0; n < b.N; n++ {
  14. Fib(10)
  15. }
  16. }

2.2 运行命令采集数据

  1. go test -bench=. -run=none \
  2. -benchmem -memprofile=mem.pprof \
  3. -cpuprofile=cpu.pprof \
  4. -blockprofile=block.pprof

也可以用一个一个命令来完成采集数据,分开运行:

  1. go test -bench=. -run=none -benchmem -memprofile=mem.pprof
  1. go test -bench=. -run=none -benchmem -cpuprofile=cpu.pprof

2.3 分析数据

前面有 两篇 pprof 的文章怎么分析数据,一种方法是命令行交互分析模式,一种是可视化图形分析模式。

A. 命令行交互分析

分析 cpu:

  1. go tool pprof cpu.pprof

再用 top15 命令分析,或者 top --cum 进行排序分析

如下图:

B. web 界面分析

命令行执行命令:

  1. go tool pprof -http=":8080" cpu.pprof

会自动在浏览器上打开地址:http://localhost:8080/ui/ ,然后就可以在浏览器上查看各种分析数据,如下图:

其他数据也可以进行同样的分析,这里就略过。

[完]

golang 性能优化分析:benchmark 结合 pprof的更多相关文章

  1. Golang 性能优化实战

    小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...

  2. SQL SERVER 查询性能优化——分析事务与锁(五)

    SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...

  3. 一次 group by + order by 性能优化分析

    一次 group by + order by 性能优化分析 最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家 ...

  4. ubifs性能优化分析

    本文通过分析ubifs的mount.read.write和commit流程,挖掘ubifs背后的设计决策和性能优化手段,并结合自身产品的特点,给出一些读写性能改进方案.   1.     ubifs  ...

  5. mysql性能优化分析 --- 下篇

    概要回顾 之前看过<高性能mysql>对mysql数据库有了系统化的理解,虽然没能达到精通,但有了概念,遇到问题时会有逻辑条理的分析; 这回继上次sql分析结果的一个继续延伸分析,我拿了; ...

  6. Web性能优化系列(1):Web性能优化分析

    本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿.未经许可,禁止转载!英文出处:gokulkrishh.github.io.欢迎加入翻译小组. 如果你的网站在1000ms内加载完成, ...

  7. Web性能优化分析

    如果你的网站在1000ms内加载完成,那么会有平均一个用户停留下来.2014年,平均网页的大小是1.9MB.看下图了解更多统计信息. 直击现场 <HTML开发MacOSApp教程>  ht ...

  8. mysql性能优化分析 --- 上篇

    概要 之前看过<高性能mysql>对mysql数据库有了系统化的理解,虽然没能达到精通,但有了概念,遇到问题时会有逻辑条理的分析; 问题 问题:公司xxx页面调用某个接口时,loading ...

  9. MySQL索引及性能优化分析

    一.SQL性能下降的原因 查询语句问题,各种连接.子查询 索引失效(单值索引.复合索引) 服务器调优及各个参数设置(缓冲.线程池等) 二.索引 排好序的快速查找数据结构 1. 索引分类 单值索引 一个 ...

随机推荐

  1. 2020 Web 全栈面经

    2020 Web 全栈面经 1.简历 2. 技术 3. 项目 4. 架构 5. 沟通,协作 6.成长 7. 面试技巧 准备 电话确认,面试流程,五险一金缴纳情况 有无笔试,几轮,面试时间,答复时间 细 ...

  2. 如何使用 js 写一个正常人看不懂的无聊代码

    如何使用 js 写一个正常人看不懂的无聊代码 代码质量, 代码可读性, 代码可维护性, clean code WAT js WTF https://www.destroyallsoftware.com ...

  3. JavaScript Number Type Checker

    JavaScript Number Type Checker Number.isInteger // static 方法 Number.isInteger(value) https://develop ...

  4. css infinite loop animation

    css infinite loop animation @keyframes loop { 0% { transform: translateX(0%); } constructed styleshe ...

  5. CSS rulesets

    CSS rulesets https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax#CSS_rulesets https://css-tricks ...

  6. vs code & macOS services

    vs code & macOS services Mac OS X, Open Folder With VS Code (right click) https://github.com/Mic ...

  7. 5G & 音频,视频

    5G & 音频,视频 直播,webtrtc 音频,视频 基础知识 基本概念.播放流程.封装格式.编解码.传输协议 音视频播放流程 主要流程:采集 -> 前处理 -> 编码 -> ...

  8. react-parent-child-lifecycle-order

    react-parent-child-lifecycle-order react parent child lifecycle order live demo https://33qrr.csb.ap ...

  9. PPT & order & animation

    PPT & order & animation powerpoint order of appearance https://support.office.com/en-us/arti ...

  10. project config generator

    project config generator React, Vue, https://createapp.dev/ parcel https://parceljs.org/ https://git ...