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

标签 java 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
}

关于java - 如何检测 StopWatch guava 的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54424132/

相关文章:

java - 从 Java 操作终端 session

java - 使用 Lombok 和构造函数注入(inject) Spring 注入(inject) bean 为 null

java - 在动态文本android末尾添加三个点

java - 类似于 Guava 的 EventBus 的消息服务

java.lang.NoClassDefFoundError : com/google/common/collect/ImmutableMap error using GeckoDriver Firefox through Selenium in Java

java - 多键多值映射可能吗?

java - JSplitPane 只向一个方向移动

java - 设置内容类型 Azure Blob 存储

java - 如何在不同的 web 应用程序中使用 EventBus 共享事件?

java - 使用 Guava EventBus 进行条件订阅