Go压测工具

news2024/11/28 22:47:40

前言

在做Go的性能分析调研的时候也使用到了一些压测方面的工具,go本身也给我们提供了BenchMark性能测试用例,可以很好的去测试我们的单个程序性能,比如测试某个函数,另外还有第三方包go-wrk也可以帮助我们做http接口的性能压测,今天就来介绍下这两种工具的使用。

BenchMark 

BenchMark是Go的单测包testing里提供的一个压测工具类,可以帮助我们测试某个代码片段或者函数的性能,包括耗时、内存占用和内存分配的情况。

使用方法

在单元测试文件中写一个性能的单测函数,函数名必须以Benchmark开头

下面写一个测试json序列化的性能测试用例:

func BenchmarkEncodingJsonMarshal(b *testing.B) {
    for i := 0; i < b.N; i++ {   //固定写法,N表示随机执行多少次,多次执行可以保证测试结果的可靠性
        json.Marshal(agentAggregatedDetections)  //要测试的程序片段
    }
}

执行结果如下:

 有的时候我们测试某个函数只希望测试某个代码片段,可能就认为这里需要验证一下,这种也可以在单测里面标识,下面这个代码执行情况和上面一样

func BenchmarkEncodingJsonMarshal(b *testing.B) {
    //与性能无关的代码
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        json.Marshal(agentAggregatedDetections)
    }
    b.StopTimer()
    //与性能无关的代码
}

上面这种方法是在编辑器里面执行的,我们也可以在命令行里面执行对应的test类,并且可以带上一些参数观察更多的信息,这个也是比较常用的方式

执行命令:

go test -bench=BenchmarkEncodingJsonMarshal   //如果要执行所有的测试类下面的Benchmark函数:bench=.

辅助参数

-benchtime
  • 前面的命令中我们并没有指定测试时长,因此使用的是默认值1秒,现在咱们来修改这个参数试试,毕竟1秒内完成基准测试并不是普遍适用的
  • 指定基准测试时长为10秒:go test -bench=BenchmarkEncodingJsonMarshal -benchtime=10s
  • 除了指定测试时长,还可以通过benchtime指定执行次数,这个次数就是我们在for循环里写的b.N这个数字,标识执行多少次循环,指定程序执行1000次:-benchtime=1000x
-count
  • count是用来控制函数的执行次数,默认是1次,这个和benchtime里面的次数不同,count是控制Benchmarkxxx函数的执行次数,benchtime是控制函数里面for循环的执行次数
    go test -bench=BenchmarkEncodingJsonMarshal -count=2 -benchtime=1000x

-benchmem
  • benchmem参数可以用来查看程序在执行的时候内存使用和内存次数分配的情况
    go test -bench=BenchmarkEncodingJsonMarshal  -benchtime=1000x -benchmem

go-wrk

go版本的wrk工具,用来压测http接口,go-wrk本身也是一个第三方的go项目,项目地址:GitHub - adjust/go-wrk: a small heavy duty http/https benchmark tool written in go

安装go-wrk

1、下载项目到本地:git clone https://github.com/adjust/go-wrk.git

2、执行go mod init go-wrk初始化module

3、go build生成go-wrk可执行文件

使用go-wrk

压测一个go服务的http接口:go-wrk -c=400 -t=8 -n=10000 -m=GET "http://10.106.19.12:8080/performance/pertest"

命令行中的参数说明:

-H="User-Agent: go-wrk 0.1 bechmark\nContent-Type: text/html;": 由'\n'分隔的请求头
-c=100: 使用的最大连接数
-k=true: 是否禁用keep-alives
-i=false: if TLS security checks are disabled
-m="GET": HTTP请求方法
-n=1000: 请求总数
-t=1: 使用的线程数
-b="" HTTP请求体
-s="" 如果指定,它将计算响应中包含搜索到的字符串s的频率

输出结果参数说明:

Avg time per request:请求的平均响应时间
Requests per second:每秒钟处理的请求数量(QPS)
99th percentile time:接口请求耗时99线
Slowest time for request:耗时最长的请求时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1300149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「Verilog学习笔记」多bit MUX同步器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 输入数据暂存在data_reg中&#xff0c;使能信号data_en用打两拍的方式跨时钟域传输到时钟域B&#xff0c;最后data_out根据使能信号更新数据。data_en信号在A时钟域用一个D…

【QED】高昂的猫 Ⅰ

目录 题目背景题目描述输入格式输出格式 测试样例样例说明数据范围 思路核心代码 题目背景 这是小橘。因为它总是看起来很高傲&#xff0c;所以人送外号“高昂的猫”。 题目描述 "锕狗"的房间里放着 n n n ( 1 ≤ n ≤ 1 0 9 ) (1 \leq n \leq 10^9) (1≤n≤109)个…

忘记PDF密码了,怎么办?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

C++设计模式——Adapter(适配器)模式

一、Adapter模式是个啥&#xff1f; 适配器模式在软件开发的江湖里&#xff0c;可以说用途是非常广的。下面几个经典的场景来说明适配器模式的使用。 场景一 场景二 假如你正在开发一款股票市场监测程序&#xff0c; 它会从不同来源下载 XML 格式的股票数据&#xff0c; 然后…

USB host是如何区分reset、disconnect以及suspend?

如题。 reset和disconnect 在OTG2.0中&#xff0c;当其配置程host模式&#xff0c;当host发送reset时D/D-线都为低电平&#xff0c;这是USB协议侧的复位&#xff08;与上电复位不同&#xff0c;协议上的复位是为了对连接的dev进行枚举&#xff0c;例如对端点0进行set address…

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…

完整方案开放下载!详解中国移动《通信网络中量子计算应用研究报告》

8月30日&#xff0c;中国移动在第四届科技周暨战略性新兴产业共创发展大会上重磅发布了《通信网络中量子计算应用研究报告》。 玻色量子作为中国移动在光量子计算领域的唯一一家合作企业兼战投企业&#xff0c;在量子计算应用于通信行业达成了深入合作&#xff0c;并在5G天线多…

【代码随想录】算法训练计划41

dp 1、343. 整数拆分 题目&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 输入: n 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 思路…

电工--基本放大电路

电压放大倍数、输入电阻和输出电阻是放大电路的三个主要性能指标 共发射极基本交流放大电路 晶体管&#xff1a;电流放大作用。能量较小的输入信号通过晶体管的控制作用&#xff0c;去控制电源所共给的能量&#xff0c;以在输出端获得一个能量较大的信号 集电极电源电压&#…

接口测试 —— Jmeter读取数据库数据作测试参数

1、添加Jdbc Request 2、添加ForEach控制器(右键线程组->逻辑控制器->ForEach控制器) ①输入变量的前缀&#xff1a;mobilephone&#xff1b; 从jdbc request设置的变量得知&#xff0c;我们要取的值为mobilephone_1、mobilephone_2、mobilephone_3......所以这里输入m…

基于单片机智能病床呼叫系统设计

**单片机设计介绍&#xff0c;基于单片机智能病床呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能病床呼叫系统是一种利用单片机技术设计的医疗设备&#xff0c;它能够帮助病人在住院期间快速、方便…

侯捷C++ (二--STL标准库)

CSTL标准库与泛型编程 STL六大部件 容器 Containers分配器 Allocators 一种用来修饰容器或仿函数或迭代器接口的东西算法 Algorithms迭代器 Iterators适配器 Adapters仿函数 Functors 容器 前闭后开 大致分为两种容器&#xff1a;序列容器&#xff0c;关联容器 所谓关联容器…

安装 DevEco Studio 后不能用本地 Node.js 打开

安装 DevEco Studio 后第一次打开时&#xff0c;不能用本地 Node.js 打开 答&#xff1a;因为本地 Node.js 文件夹名字中有空格 Node.js路径只能包含字母、数字、“。”、“_”、“-”、“:”和“V” 解决方法&#xff1a; 1.修改文件夹名称 2.重新下载 注意&#xff1a;找一…

Verilog基础:$random系统函数的使用

相关阅读 Verilog基础​编辑https://blog.csdn.net/weixin_45791458/category_12263729.html $random系统函数语法的BNF范式如下所示&#xff0c;有关BNF范式相关内容&#xff0c;可以浏览以往文章Verilog基础&#xff1a;巴科斯范式(BNF)。 $random系统函数在每次调用时返回一…

【Docker】进阶之路:(一)容器技术发展史

【Docker】进阶之路&#xff1a;&#xff08;一&#xff09;容器技术发展史 什么是容器为什么需要容器容器技术的发展历程Docker容器是如何工作的 什么是容器 容器作为一种先进的虚拟化技术&#xff0c;已然成为了云原生时代软件开发和运维的标准基础设施。在了解容器技术之前…

14-1、IO流

14-1、IO流 lO流打开和关闭lO流打开模式lO流对象的状态 非格式化IO二进制IO读取二进制数据获取读长度写入二进制数据 读写指针 和 随机访问设置读/写指针位置获取读/写指针位置 字符串流 lO流打开和关闭 通过构造函数打开I/O流 其中filename表示文件路径&#xff0c;mode表示打…

C++学习笔记:继承

继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承? 继承是C语言面向对象的三大特性之一&#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加…

十九、FreeRTOS之FreeRTOS软件定时器

本节主要需要掌握以下内容&#xff1a; 1&#xff0c;软件定时器的简介&#xff08;了解&#xff09; 2&#xff0c;软件定时器的状态&#xff08;熟悉&#xff09; 3&#xff0c;单次定时器和周期定时器&#xff08;熟悉&#xff09; 4&#xff0c;软件定时器结构体成员介…

Unity中Batching优化的GPU实例化(2)

文章目录 前言一、GPU实例化的Shader准备步骤1、在Pass中声明实例化需要的变体2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID). 前言 在上篇文章中&#xff0c;我们做了一些GPU实例化的前置准备&…

查看NVIDIA CUDA版本号的四种方法

查看CUDA版本号这里有三种方法。 nvidia-smi 运行nvidia-smi命令&#xff1a; 右上角可以看到CUDA版本号。 CUDA Toolkit 下载地址&#xff1a;https://developer.nvidia.com/cuda-downloads $nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2023 NV…