首页 > 其他分享 >Go语言中的性能测试

Go语言中的性能测试

时间:2023-10-13 10:11:06浏览次数:46  
标签:测试 pprof 性能 testing 单元测试 go func Go

单元测试

测试单元的结果是否符合预期

//go_test.go
import (
	"fmt"
	"testing"
)

func Add() int {
	fmt.Println("AAAAAAAAAAAAAA")
	return 5
}
func Sub() int {
	fmt.Println("SSSSSSSSSSSSSSSS")
	return 5
}

func TestFun1(t *testing.T) {
	fmt.Println("TTTTTTTTTTTTTT111111111")
	r := Add()
    //如果返回的结果不符合预期,就显示测试不通过
	if r != 6 {
		t.Fail()
	}
}
func TestFun2(t *testing.T) {
	fmt.Println("TTTTTTTTTTTTTT222222222222")
	r := Sub()
	if r != 5 {
		t.Fail()
	}
}
go test -v go_test.go  -run=Fun1  -timeout=20m -count=1
  • -v 打印详情测试信息
  • -run 运行指定的单元测试,用正则表达式匹配
  • -timeout 默认10分钟超时
  • -count 测试函数运行几次

基准测试

反复测试多次,测试性能

func BenchmarkStrCat(b *testing.B) {
    hello := "hello"
    golang := "golang"
    for i := 0; i < b.N; i++ {
        fmt.Printf("%s %s\n", 	hello, golang)
    }
}
go test -bench=StrCat -run=^$ -benchmem -benchtime=2s -cpuprofile=data/cpu
  • -bench 正则指定运行哪些基准测试
  • -run 正则指定运行哪些单元测试
  • -benchmem 输出内存分配情况
  • -benchtime 每个函数运行多长时间
  • -cpuprofile 指定cpu使用信息的相关输出文件

测试代码规范

  • 单元测试和基准测试必须放在以_test.go为后缀的文件里。
  • 单元测试函数以Test开头,基准测试函数以Benchmark开头。
  • 单元测试以*testing.T为参数,函数无返回值。
  • 基准测试以*testing.B为参数,函数无返回值。

pprof

首先我们得先安装这两个工具:

google的pprof工具链

go get -u github.com/google/pprof

gin的pprof工具

go get github.com/DeanThompson/ginpprof

pprof是可视化性能分析工具,提供以下功能:

  1. CPU Profiling:按一定频率采集CPU使用情况。
  2. Memory Profiling:监控内存使用情况,检查内存泄漏。
  3. Goroutine Profiling:对正在运行的Goroutine进行堆栈跟踪和分析,检查协程泄漏。

监控CPU使用命令go tool pprof data/cpu

进入交互界面后常用的命令有:

  • topn:列出最耗计算资源的前n个函数
  • list func:列出某函数里每一行代码消耗多少计算资源
  • peek func:列出某函数里最耗计算资源的前几个子函数

pprof结果可以在浏览器上进行可视化。

go tool pprof -http=:8080 data/cpu

注意:

  • 在执行这个命令的时候有时候会报错,

    Could not execute dot; may need to install graphviz.
    

    说缺少graphviz,那我们就要去下载并安装,graphviz下载地址

  • 安装之后还得把安装目录下的bin添加到path中

标签:测试,pprof,性能,testing,单元测试,go,func,Go
From: https://www.cnblogs.com/guangdelw/p/17761285.html

相关文章

  • 云服务测试DPDK
    一、DPDK的系统要求1.1x86上的BIOS的设置先决条件1.1.1 对于大多数平台,不需要特殊的BIOS设置即可使用基本的DPDK功能;1.1.2为了获得额外的HPET定时器和电源管理功能以及小数据包的高性能,可能需要更改BIOS设置;1.2DPDK编译(Ubuntu22.04)......
  • .Net核心级的性能优化(GC篇)
    1.前言大部分人对于.Net性能优化,都停留在业务层面。或者简单的.Net框架配置层面。本篇来看下.Net核心部分GC垃圾回收配置:保留VM,大对象,独立GC,节省内存等.Net8里面有很多的各种GC配置,用以帮助你的程序进行最大程度性能提升和优化。文章分为两部分,第一个是GC有哪些动作可以性能......
  • 软件测试面试题-逻辑题【杭州多测师_王sir】
    1.你有不限量的水,还有两个罐子,容量分别是5升和3升,怎么取4升的水?先把3升的杯子装满,倒进5升的杯子;之后把3升的杯子装满,倒进5升的杯子,里面还剩1升。之后把5升的杯子里的水都倒掉,把3升的杯子里的1升倒进去。再把3升的杯子装满,倒进5升的杯子。2.房间内有三盏灯,房外有三个开关,只能......
  • DevEco Hvigor高效编译,构建过程新秘籍
     作者:Lewei,华为终端BG编译构建技术专家DevEco Hvigor是使用TypeScript语言开发的全新轻量化的任务调度工具,针对HarmonyOS应用提供了一系列编译构建任务,支持将HarmonyOS应用编译构建出对应的产物包。作为一款HarmonyOS应用编译构建任务流工具,DevEco Hvigor具备许多可以提升......
  • Django中关于路由匹配的源码分析
    1:关于路由#django中,路由的写法有很多,从最早一点几版本的url(xxxxx)的形式到后面re_path(xxxx),以及参考flask的path(xxxx)的格式。#无论是哪种,实现的功能本质上就是,匹配url和对应的额视图函数,换言之,就是,找到用户访问的url对应的视图函数,并且执行它。#下面是urls.p......
  • Postman接口测试
    编写代码之前需手动提前创建并选择对应的环境!!!postman使用的是js语言1、自动关联数据描述:接口A的请求参数依赖于接口B的响应数据例如:接口调用需要登录校验,需要先调登录接口拿到token/cookie解决方法:①从接口B的响应数据中提取关联数据,保存关联数据在公共容器中pm对象的详......
  • Go语言模块管理:GO111MODULE的含义
    在cmd中使用goenv命令可以查看到我们的GOPATH环境变量。其目录结构为:bin:存放代码编译后的二进制文件pkg:存放编译后的库文件src:存放自己编写的Go语言代码文件在Go1.11后新增了modules特性,模块是相关Go包的集合。如果在cmd中执行以下命令将GO111MODULE变量的值设为on:go......
  • django 结合rpc服务传输
    1概述2基础依赖3定义服务和消息4生成gRPC代码5创建服务和客户端服务6启动服务端和客户端7Django中集成gRPC8安全认证方面9健康检测10相关文档生成概述gRPC(gRPCRemoteProcedureCall)是一种高性能、跨语言的远程过程调用(RPC)框架,由Google开发并......
  • CF264B Good Sequences 题解
    GoodSequences状态很显然,设\(f[i]\)表示位置\(i\)的最长长度。关键是转移,暴力转移是\(O(n^2)\)的,我们必须找到一个更优秀的转移。因为一个数的质因子数量是\(O(\logn)\)的,而只有和这个数具有相同质因子的数是可以转移的;因此我们可以对于每个质数\(p\),设一个\(mx_p......
  • map 简单梳理【GO 基础】
    〇、map简介map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。其中键可以是任何类型,但值必须是可比较的类型(如整数、字符串、布尔值等)。一、map的定义和使用1.1map的定义map[KeyType]ValueType//KeyType:表示键的类型//Value......