【问题标题】:How to measure exact execution time for a process/method that gets frequently interrupted?如何测量经常中断的进程/方法的确切执行时间?
【发布时间】:2019-10-16 08:38:41
【问题描述】:

目前,这就是我如何获得完成流程所需的时间。

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

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

long end = System.currentTimeMillis();

已到达。无论进程是否被单独暂停,如何才能获得确切的持续时间。

【问题讨论】:

  • 听起来有点奇怪,你正在计时一个进程,而你会让你的计算机在两者之间休眠。要获得您想要的可能需要本机代码,使解决方案比您的问题复杂得多。如果您正在计时操作,请不要让您的计算机进入睡眠状态。就这么简单。
  • 据我了解,在 JDK 上创建了类似的票证,请参阅bugs.openjdk.java.net/browse/JDK-8146730
  • @SiddarthSreeni 看起来并不相关,因为它与 Windows 平台上的特定本机时间有关。问题更多是关于“如何测量挂钟时间减去休眠时间”。
  • 您可以从亚马逊租用便宜的服务器并在那里运行您的代码,只要您愿意。那将是最直接的解决方案。如果您没有可靠的电源/网络,那么您将不会成为一个非常高效的开发人员,尤其是如果您需要使用技巧来继续开发。但我会给你一些东西......
  • 这听起来可能有点菜鸟,但是使用 Date 类对你有利呢?我的意思是,您可以获取流程前后的当前时间并计算差异。唯一的缺点(我能想到的)是在尝试获取当前时间时可能会出现一分钟的时间延迟。

标签: java timing


【解决方案1】:

所以你的问题是“这个过程花费了多少挂钟时间,而没有时间花在休眠状态”。嗯,挂钟时间很容易获得,但你真的没有机会知道是否发生了休眠。

不过……

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

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 做某事,则具有较大值的步骤可能会花费更多时间,因此单个截止值将不起作用(尽管您可以根据输入考虑某种动态截止值)。

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

【讨论】:

    猜你喜欢
    • 2020-11-28
    • 2021-02-07
    • 2011-09-08
    • 2023-04-07
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2011-11-14
    相关资源
    最近更新 更多