TP50、TP90、TP99、TP999
- TP(Top Percentile)Top百分数,是一个统计学的术语,与平均数、中位数一样。是不是看着这句话很眼熟?
- 在网上看了很多帖子,是这样解释这些指标的:
- TP50:满足百分之五十的网络请求所需的最低耗时。
- TP90:满足百分之九十的网络请求所需的最低耗时。
- TP99:满足百分之九十九的网络请求所需的最低耗时。
- TP999:满足千分之九百九十九的网络请求所需的最低耗时。
例子
- 例子大概是这样写的:
- 有四次请求耗时分别为:
10ms,1000ms,100ms,2ms
那么我们可以这样计算TP99:
先进行排序,默认从小到大正序排列,排序后的结果:
2ms,10ms,10ms,1000ms,4次请求中,99%的请求数为4*0.99,进位取整也就是4次(数组长度也是4,取最后一个,有的地方也可以直接取整是3,那么也取数组的第三位,0,1,2,3),满足这全部4次请求的的最低耗时为1000ms,也就是TP99的答案是1000ms。 - 下边有个简单的事例:
public class MethodInfo {
private String name;
private long times;
private long endTimes;
public MethodInfo() {
}
public MethodInfo(String name, long times,long endTimes) {
this.name = name;
this.times = times;
this.endTimes = endTimes;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getTimes() {
return times;
}
public void setTimes(long times) {
this.times = times;
}
public long getEndTimes() {
return endTimes;
}
public void setEndTimes(long endTimes) {
this.endTimes = endTimes;
}
}
private long getTP(List<MethodInfo> methodInfos,double rate){
List<MethodInfo> sortInfo = new ArrayList<>();
long endTime = System.currentTimeMillis();
long startTime = System.currentTimeMillis() - 60000;
int length = methodInfos.size();
for (int i=0;i<length;i++){
MethodInfo methodInfo = methodInfos.get(i);
if (methodInfo.getEndTimes() >= startTime && methodInfo.getEndTimes() <= endTime){
sortInfo.add(methodInfo);
}
}
sortInfo.sort(new Comparator<MethodInfo>() {
@Override
public int compare(MethodInfo o1, MethodInfo o2) {
if(o1.getTimes() > o2.getTimes()){
return 1;
}else if(o1.getTimes() < o2.getTimes()){
return -1;
}else{
return 0;
}
}
});
int index = (int)(sortInfo.size() * rate);
return sortInfo.get(index).getTimes();
}
for(Map.Entry<String,List<MethodInfo>> methodInfos : methodTimes.entrySet()){
System.out.println(methodInfos.getKey() +"的TP90:" + getTP(methodInfos.getValue(),0.9) + "毫秒,"
+ "TP99:" + getTP(methodInfos.getValue(),0.99)+ "毫秒" );
}