如何检测 StopWatch guava 的执行时间?

How to detect the execution time of StopWatch guava?

最近在用guava,遇到这样一个问题想测一下put(str)方法执行的总时间,就是把字符串放到map中。我尝试使用 StopWatch 来执行此操作并计算方法执行的平均时间,但目前我不断返回 0

private int putCounter = 0;
    private Stopwatch stopWatch = new Stopwatch();
    private CustomCache mapBasedCache = new MapBasedCache();

    @Override
    public void getEvictions(String str) {
        stopWatch.start();
        mapBasedCache.put(str);
        putCounter++;
        stopWatch.stop();
    }

    @Override
    public long getAveragePutTime() {
        return stopWatch.elapsedTime(TimeUnit.SECONDS) / putCounter;
    }

我的测试方法:

public void getAveragePutTime() {
        for (int i = 0; i < 10_000_000; i++){
            gg.getEvictions("ab" + i);
        }


        long time = gg.getAveragePutTime();
        System.out.println(time);
    }

通过转换为 double:

来修复它
@Override
public double getAveragePutTime() {
    return (double)(stopWatch.elapsedTime(TimeUnit.SECONDS)) / putCounter;
}

为什么?

因为您将最坏情况下的 10 秒除以 1000 万。使用长整数和整数!!

在java中,(long)10 / (int)10_000_000只会给出0。所以只要在某处投一个双。

或者更好的是,使用更精确的时间单位:

@Override
public double getAveragePutTime() {
    return (double)(stopWatch.elapsedTime(TimeUnit.NANOSECONDS)) / putCounter
}