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

标签 java timing

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

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/

相关文章:

inheritance - 我收到此错误“运算符 + 无法应用于 java.lang.string void”

java - 为什么在 Google App Engine 上首次访问 JSP 文件需要更长的时间?

python - 如何解释timeit返回的字符串

c++ - 我可以在Linux上获得最佳的时间分辨率

php - 您如何运行一个长的 PHP 脚本并通过 HTTP 不断向浏览器发送更新?

java - JPanel 中的 JLabel 对齐

java - 如果数据已经存在,如何验证 jTextField?

jquery 幻灯片和计时

c++ - 多个嵌套 for 循环与单个 for 循环

java - startAnimation(anim) 上的 NullPointerException