我想计算我的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程序本身完成执行所花费的确切时间?注意 :
我们可以多次运行代码并花费平均时间来最小化这种情况的影响,仍然很高兴知道是否有一些可靠的方法来计算执行时间
让我们假设我们需要时间的代码部分不能分解成更小的块并且需要花费大量时间来处理.
我正在读一本名为"思考Java:如何像计算机科学家一样思考"的书,我最近介绍了递归方法.
public static void countdown(int n)
{
if (n == 0) {
System.out.println("Blastoff!");
} else {
System.out.println(n);
countdown(n - 1);
}
}
Run Code Online (Sandbox Code Playgroud)
这将是一个正常的递归方法,用于倒数到0,我理解发生了什么,但如果你在System.out.println之前进行递归调用,就像这样
public static void countdown(int n)
{
if (n == 0) {
System.out.println("Blastoff!");
} else {
countdown(n - 1);
System.out.println(n);
}
}
Run Code Online (Sandbox Code Playgroud)
它以相反的方式计算,所以如果我为这两个条件语句给出参数3,那么第一个变为"3,2,1,Blastoff!" 但是第二个1是"Blastoff,1,2,3"....我不明白它是如何工作的,有人可以尝试解释这段代码中发生的事情,使其以相反的方式计数吗?