计算Java程序执行时间

3
我想计算我的Java程序的执行时间,但我不确定该如何进行。我知道可以使用System.nanoTime()和System.currentTimeInMillis()来计算经过的时间,但这种方法没有考虑操作系统的底层调度机制。
例如:假设同时有3个进程运行(假设是单核系统)
- 进程A - 进程B(我的Java代码 - 在JVM进程中运行) - 进程C
现在,如果进程B从上午11:00开始执行,并在上午11:02完成执行,则System.nanoTime()和System.currentTimeInMillis()将报告所用时间为2分钟。但是可能进程B并未在整个2分钟内始终运行,因为操作系统将调度其他2个进程,并且它们在2分钟间隔中会运行一段时间。因此,实际上java程序运行的时间要少于2分钟。
有没有一种方式可以精确地确定Java程序本身完成执行所需的确切时间? 注意:
1. 我们可以多次运行代码并取平均时间以减小这种情况的影响,但了解是否有可靠的方法来计算执行时间仍然很好。 2. 假设我们需要计时的代码部分无法分成较小的块并且需要大量处理时间。

1
使用性能分析器检查时间。 - stinepike
答案在这里 - 看起来是SO问题的重复 - https://dev59.com/InVC5IYBdhLWcg3wz0h9 - spiderman
那里的答案更注重于使用nanotTime()/currentTimeInMillis()来计算执行时间,但它并没有考虑操作系统调度时间。 - Kakarot
我曾经在我的shell PS1上放置了“日期”和“时间”,以便我知道每个命令运行的时间有多长。 - zinking
尝试使用这个机制:https://dev59.com/h3A75IYBdhLWcg3wRW2c - yegor256
2个回答

5

如果你正在使用Java 8,那么它有一个Instant类,该类表示时间轴上的即时点。这个类模拟了时间轴上的单个瞬时点。可以将其用于记录应用程序中的事件时间戳,例如:

    Instant start = Instant.now();
    try {
        Thread.sleep(7000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Instant end = Instant.now();
    System.out.println(Duration.between(start, end));
}

它会打印出:PT7.001S


4
老式的方法是...将其分解成方法。
long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();

long duration = endTime - startTime;

这是我们通常采用的方法,将其分解为小函数并计时,以避免调度效应。但是,如果有些东西无法分解且需要大量时间来计算,则最终会面临正确计时的问题。 - Kakarot
我相信如果你把所有这些计算方法加起来,你会得到大约与一个方法相同的时间。如果你需要对你的程序进行分析,我建议使用NetBean的分析工具,但是对于整体执行时间,System.currentTimeMillis(); 应该足以获取你想要的信息。 - Moonhead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接