前言在性能测试中,多选择TP90、TP95或TP99等水位线作为性能指标。 首先,说明TP90、TP95、TP99的意思。
TP90、top percent 90 (即90% )的数据满足一定条件;
TP95、top percent 95,即95%的数据满足一定条件;
TP99、top percent 99,即99%的数据满足一定条件;
在这里,我们之所以说那个“满足一定条件”,是因为在计算的时候,既可以向前计算,也可以向后计算。 例如:
1,2,3,…,98,99,100
如上所示,这是从1到100的数列。 如果想计算那个TP99的值,那个方法就是用数列中数值的总个数乘以99%。 即,100 * 99%=99。 很明显,这个数列有两个满足这99个概念的数值:
2 )即数列99%的数值均在299以上。 也就是说,数列99%的数值都在99以下。 因此,TP90、TP95或TP99等水位线有两种含义。 具体选择哪一个,可以根据需求自己选择。
计算水位线的值(如计算方法TP90、TP95或TP99 )时,假定必须保存所有计算值。 那么,应该使用什么样的数据结构来保存这一系列的值呢? 数组? 还是名单? 实际上,无论选择哪个数据结构,都不能假设长度无限大。 内存空间是有限的,数据结构也有理论上的最大值,但存储的值数量可能是无限的。 因此,需要利用有限长度的数据结构来存储更多的数值。 其中,数据结构选择数组,并以计算耗时的水位线(如TP90、TP95或TP99 )为例。
双精度[ ] scale=new double [ 2400 ]
int [ ] count container=new int [ 2400 ]
如上所示,我们创建了两个相同长度的数组。 其中
SCALE数组,包含表示相应耗时值的耗时占位符;
一个countContainer数组,包含需要时间的值的出现次数。 与SCALE序列一一对应
例如,如果SCALE[1024]的值为1025,countContainer[1024]的值为2050,则时间为1025的值为2050次。
因为虽然费时的值无限大,但我们不能囊括其中所有的值。 更现实地说,费时间的值大部分集中在某个地区。 因此,只需列出常用数值并使用步长进行控制即可。 具体方法如下。
SCALE数组索引0 ~ 999、内存1 ~ 1000、步骤1
SCALE数组索引1000 ~ 1899、存储器1010 ~ 10000、步骤10
SCALE数组索引1900 ~ 2399、存储器10100 ~ 60000、步骤100
计数容器数组索引0到0 ~ 2399全部初始化为0
其中,最大存储时间值为60000,表示60000毫秒或1分钟。
在记录需要时间t的情况下,假设t=1000,
如果通过计算发现在SCALE数组中具有匹配的时隙比特且SCALE[999]=1000,则相应的时隙比特的索引值为999;
在计数容器数组中,将计数容器[ 999 ]的值累计为1
循环步骤1和步骤2
如果要计算TP99的值,请停止步骤3,获取总记录数sum (计数容器数组中所有值的累加),然后执行以下操作:
计算TP99的水位线,假设sum * 99%=waterline99
从countContainer[0]开始,从前到后累加数组的值。 或者,从countContainer[2399]开始,从后向前累加数组的值。
计数容器[0]计数容器[1]…如果计数容器[ target ]=waterline 99,则记录target索引
如果带target匹配SCALE数组中的相应槽位,则SCALE[target]为TP99的值
至此,TP99的计算完成。 此外,可以进行TP90、TP95、甚至TP50等同样的计算。