性能测试误差统计实践
在之前两篇文章性能测试误差分析文字版-上、性能测试误差分析文字版-下中,我从纯文字的角度分析了误差产生的原因和来源。接下来就是需要定量分析了。但是在这之前需要做一些准备工作,就是要在测试框架中支持这种误差的统计。
前文讲到过的两种计算公式:
QPS = 总请求量除以总时间,以下:
QPS = count(r)/T
QPS = 线程数除以平均响应时间
QPS = thread/rt
第二种方式是我一贯采取的公式,所以现在要实现第一种统计方式。
统计对象支持
在性能测试数据统计对象类PerformanceResultBean
中我增加了两个属性:
/**
* 通过QPS=count(r)/T公式计算得到的QPS,在固定QPS模式中,这个值来源于预设QPS
*/
double qps2
/**
* 理论误差,两种统计模式
*/
String deviation
在构造方法中我增加了赋值过程:
this.qps2 = qps2
this.deviation = com.funtester.frame.SourceCode.getPercent(Math.abs(qps - qps2) * 100 / Math.max(qps, qps2))
基本工作已经做完了,下面是在两个性能测试模型固定线程模型和固定QPS模型中的实现。
固定线程模型中实现
主要思路就是获取两个值:请求总数和请求总时间。我在ThreadBase
类中用了一个属性
/**
* 执行数,一般与响应时间记录数量相同
*/
public int executeNum;
然后在最近测试结束的时候,将各个线程的统计在一起。
threads.forEach(x -> {
if (x.status()) failTotal++;
errorTotal += x.errorNum;
executeTotal += x.executeNum;
});
最后计算QPS2
的值double qps2 = (executeTotal + errorTotal) * 1000.0 / (endTime - startTime);
。
固定QPS模型中实现
由于模型的特殊性,总请求次数已经在FixedQpsConcurrent
统计了:public static AtomicInteger executeTimes = new AtomicInteger(0);
,然后在子类中的使用场景如下:
@Override
public void run() {
try {
before();
threadmark = this.mark == null ? EMPTY : this.mark.mark(this);
long s = Time.getTimeStamp();
doing();
long e = Time.getTimeStamp();
//计数器加一
FixedQpsConcurrent.executeTimes.getAndIncrement();
int diff = (int) (e - s);
FixedQpsConcurrent.allTimes.add(diff);
if (diff > HttpClientConstant.MAX_ACCEPT_TIME)
FixedQpsConcurrent.marks.add(diff + CONNECTOR + threadmark + CONNECTOR + Time.getNow());
} catch (Exception e) {
FixedQpsConcurrent.errorTimes.getAndIncrement();
logger.warn("执行任务失败!,标记:{}", threadmark, e);
} finally {
after();
}
}
接下来是计算统计方式的代码int qps2 = baseThread.qps;
,这里由于第二种统计公式并不成立,所以用了预期QPS
代替了qps2
的值。
- 基本工作终于做完了,接下来我会定量进行在不同场景下的误差对比分析。敬请期待!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了