这是我编写的用于测量延迟的非常简单的类。 HDRHistogram并不是劳斯莱斯解决方案,但是如果您只想向项目添加一个类,则可以很好地解决问题。
这是一个简单的测试程序,向您展示其用法:
package util;
public class LatencyMeasureExample {
public static void main(String[] args) throws InterruptedException{
//Below are a couple of examples
LatencyMeasure lm = new LatencyMeasure(1000000);
System.out.println("Thread.sleep() random");
for (int i = 0; i < 100000; i++) {
lm.startMeasure();
Thread.sleep((long)Math.random()*10);
lm.endMeasure();
}
lm.printStats();
lm = new LatencyMeasure(1000000);
double d = 0;
System.out.println("\nMath.sqrt");
for (int i = 0; i < 100000; i++) {
lm.startMeasure();
d+=Math.sqrt(i);
lm.endMeasure();
}
lm.printStats();
}
}
这是一些示例输出:
Thread.sleep() random
Latency measured:
0.32 us for 50 percentile
0.44 us for 90 percentile
0.68 us for 99 percentile
26.82 us for 99.9 percentile
582.66 us for 99.99 percentile
2024.92 us worst percentile
Math.sqrt
Latency measured:
0.04 us for 50 percentile
0.06 us for 90 percentile
0.09 us for 99 percentile
0.12 us for 99.9 percentile
0.20 us for 99.99 percentile
28.17 us worst percentile
只有4种方法:
- 构造函数:这需要一个int表示要测量的最大次数。 除了对内存的影响外,过大的大小也不是问题。 在此实现中,您至少需要进行10,000次测量才能使代码正常工作。 如果您想花更少的钱,只需在printStats()中适当调整代码即可。
- 在要测量的代码的任一侧调用startMeasure()和endMeasure()。
- printStats()打印出结果。
实施如下:
package util;
import java.util.Arrays;
public class LatencyMeasure {
private long[] times;
private long time;
private int index=0;
public LatencyMeasure(int maxCapacity) {
times = new long[maxCapacity];
for (int i = 0; i < times.length; i++) {
times[i] = -1;
}
}
public void startMeasure(){
time = System.nanoTime();
}
public void endMeasure() {
times[index++] = System.nanoTime()-time;
}
public void printStats() {
int filled = 0;
for (int i = 0; i < times.length; i++) {
if (times[i] == -1) {
filled = i;
break;
}
}
long[] popTimes = new long[filled];
System.arraycopy(times, 0, popTimes, 0, filled);
Arrays.sort(popTimes);
System.out.printf("Latency measured: \n" +
" %.2f us for 50 percentile\n" +
" %.2f us for 90 percentile\n" +
" %.2f us for 99 percentile\n" +
" %.2f us for 99.9 percentile\n" +
" %.2f us for 99.99 percentile\n" +
" %.2f us worst percentile\n",
popTimes[popTimes.length / 2] / 1e3,
popTimes[popTimes.length * 9 / 10] / 1e3,
popTimes[popTimes.length - popTimes.length / 100] / 1e3,
popTimes[popTimes.length - popTimes.length / 1000] / 1e3,
popTimes[popTimes.length - popTimes.length / 10000] / 1e3,
popTimes[popTimes.length - 1] / 1e3
);
}
}
翻译自: https://www.javacodegeeks.com/2015/05/simple-class-to-measure-latency.html