gpt4 book ai didi

java - 如何测量频繁中断的流程/方法的准确执行时间?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:41 24 4
gpt4 key购买 nike

目前,这就是我获取流程完成时间的方式。

long start = System.currentTimeMillis();
process();
long end = System.currentTimeMillis();
long duration = stop - start;
System.out.println(duration);

我目前面临的问题是 process() 会在没有电源时被我的电脑 hibernate 中断(暂停)(我的工作环境在外面所以我必须使用电池)所以只要我在插入时重新启动电脑,它就可以继续。我完全知道我会得到一个错误的持续时间,例如,由于进程暂停(在 hibernate 期间)我无法重新启动大约 2 小时,因为这意味着额外的 2 小时将通过 CMOS 电池由 CPU 时钟计算随时备份

long end = System.currentTimeMillis();

达到了。无论进程被分别暂停,如何才能获得准确的持续时间。

最佳答案

所以你的问题是“这个过程花了多少挂钟时间,没有 hibernate 时间”。好吧,挂钟时间很容易获得,但您真的没有机会知道 hibernate 是否发生。

但是...

如果您的流程是一组离散的步骤,您可以执行如下操作

List<Duration> durations = new ArrayList<>();
for(Step step : steps) {
Instant stepStart = Instant.now();
process(step);
durations.add(Duration.between(stepStart, Instant.now()));
}

long totalMillis = durations.stream()
.mapToLong(Duration::toMillis)
.filter(ms -> ms < 1000) // Cut off limit, to disregard hibernate steps
.sum();

这对每个步骤分别计时,如果一个步骤的时间超过 1 秒,则不计入总数。您还可以为这些步骤使用“平均”时间,这样最终结果会更真实一些(当然这取决于步骤数、单个步骤的假定运行时间等)。

这仅在对“太多”时间有一个很好的限制时才有效,并且它提供的结果不太准确。如果您正在使用 BigInteger 做某事,具有较大值的步骤可能会花费更多时间,因此单个截止值将不起作用(尽管您可以考虑某种动态截止值,基于输入)。

最便宜、最简单和最好的解决方案:在服务器上运行代码。

关于java - 如何测量频繁中断的流程/方法的准确执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com