Go的基准测试

基准测试(Benchmark)是一项用于测量和评估软件性能指标的方法,主要用于评估你写的代码的性能。

  • 基准测试的代码文件必须以_test.go结尾
  • 基准测试的函数必须以Benchmark开头,必须是可导出的
  • 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
  • 基准测试函数不能有返回值
  • b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
  • 最后的for循环很重要,被测试的代码要放到循环里
  • b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能

-benchmem可以提供每次操作分配内存的次数

  1. 参数-bench,它指明要测试的函数;点字符意思是测试当前所有以Benchmark为前缀函数
  2. 参数-benchmem,性能测试的时候显示测试函数的内存分配大小,内存分配次数的统计信息
  3. 参数-count n,运行测试和性能多少此,默认一次

基准测试: 基准测试就是在一定的工作负载之下检测程序性能的一种方法

复制代码
go test -bench=. -benchmem 不指定参数,就是当前目录运行所有测试文件
go test -bench=Split(方法名) 只有前三个参数
go test -bench=Split -benchmem ,会有以下五个参数

BenchmarkSplit-4                 600084              1928 ns/op             432 B/op          2 allocs/op

(1)BenchmarkSplit-4 表示对Split函数进行基准测试,数字4表示GOMAXPROCS的值,这个对于并发基准测试很重要。
(2)600084 表示循环次数,即b.N的值
(3)1928 ns/op  600084/op 表示每次调用Split函数耗时172ns,这个结果是600084次调用的平均值
(4)432 B/op 表示每次操作内存分配了96字节
(5)2 allocs/op 则表示每次操作进行了1次内存分配。

在 Go 中,基准测试(Benchmark)是通过 testing 包来实现的。

基准测试的目的是测量一段代码的性能,通常是一个函数的执行时间。

以下是一个示例,演示如何使用基准测试来测试一个简单的 HTTP 处理器的性能:

复制代码
package main

import (
  "net/http"
  "net/http/httptest"
  "testing"
)

// 要测试的处理器
func myHandler(w http.ResponseWriter, r *http.Request) {
  // 模拟处理时间
  // 此处可以放入你的实际处理逻辑
}

// 基准测试函数
func BenchmarkMyHandler(b *testing.B) {
  // 创建一个模拟 HTTP 请求
  req, err := http.NewRequest("GET", "/", nil)
  if err != nil {
  	b.Fatal(err)
	}

  // 在基准测试中,使用 b.N 来确定要运行的迭代次数
  for i := 0; i < b.N; i++ {
    // 使用 httptest 包创建一个 ResponseRecorder (实现了 http.ResponseWriter)
    rr := httptest.NewRecorder()

    // 记录基准测试开始时间
    b.StartTimer()

    // 模拟处理器的处理
    myHandler(rr, req)

    // 记录基准测试结束时间
    b.StopTimer()

    // 在这里你可以添加逻辑,例如记录响应时间、输出日志等
  }
}

func main() {
  // 运行基准测试
  testing.Benchmark(BenchmarkMyHandler)
}

在这个示例中,myHandler 是你要测试的处理器。BenchmarkMyHandler 函数中,我们使用 b.N 来确定要运行的迭代次数。在每个迭代中,我们使用 httptest 包创建了一个 ResponseRecorder 来记录响应,然后计算了处理时间。

运行基准测试:

复制代码
go test -bench=.

这将输出一些关于基准测试结果的信息,包括每次迭代的平均执行时间等。

相关推荐
喜欢喝果茶.几秒前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓1 分钟前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)1 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
Dragon Wu20 分钟前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
island131423 分钟前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
坚持就完事了27 分钟前
Java中的集合
java·开发语言
魔芋红茶31 分钟前
Python 项目版本控制
开发语言·python
一个有梦有戏的人40 分钟前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
云小逸1 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
冰暮流星1 小时前
javascript之二重循环练习
开发语言·javascript·数据库