使用System.currentTimeMillis()测量时间差异

7

我有一个简单的Java程序,想知道某些操作之间的时间差。对于这个问题,细节不是很重要,但我们可以考虑以下场景。

long beginTime = System.currentTimeMillis();

//Some operations. Let us asssume some database operations etc. which are time consuming.

//

long endTime = System.currentTimeMillis();

long difference = endTime - beginTime;

当代码在机器上运行时,差异有多可靠?

假设处理器开始执行我的代码的某些指令,然后给另一个进程上下文,该进程执行一段时间,然后返回来执行与这个Java进程相关的指令。

因此,时间差应取决于我的机器的当前状态,即有多少进程正在运行等等? 因此,在分析运行某些操作所需的时间时,这种机制不可靠吗?


执行操作3-4次并平均出结果应该能给您一个公正的估计。 - Manish
2个回答

14

System.currentTimeMillis()的精度取决于实现和操作系统,通常约为10毫秒。

相反,使用System.nanoTime(),它返回以纳秒为单位的最精确可用系统计时器的当前值。请注意,您只能使用它来计算经过的时间,不能将其值用作绝对时间。

示例:

long startTime = System.nanoTime();
// do something you want to measure
long elapsedTimeNs = System.nanoTime() - startTime;

谢谢您的回答。颗粒度很重要,但我特别想了解的是,我的当前系统状态和进程交错如何影响这个时间。 - Sumeet Khullar
2
计时器测量外部(“墙”)时间。如果您想要可重复的结果,请在没有其他竞争资源的情况下运行测试。 - Jim Garrison
是的,当前系统负载和其他进程确实可能会影响结果。您测量的代码执行时间越长,它受到的影响就越大。例如,如果您的代码仅执行几个基本操作(如整数相加),则线程执行很可能不会被暂停。如果您的代码在一个周期内计算数千个数字的正弦值,则当系统超载时,线程被暂停以允许其他进程运行的机会要高得多。 - icza
我曾经看到System.currentTimeMillis与nanoTime()相比相差多达100毫秒。不要使用currentTimeMillis()来测量任何性能。 - Ryan Shillington

2

我认为你的代码很好,因为它在多个项目中都被使用。如果你的代码调用了其他数据库进程等,我不认为它会影响你的时间。在那种情况下,它应该也能正常工作。

例如:

Main Process Started
long beginTime = System.currentTimeMillis();
.
.
.
Called another process (DB or command etc) -> (Another Process start)
                                               .
<Now in this time main process is waiting>     .
                                               .
                                               .
Returned from process                      <- (Another Process end)
.
.
long endTime = System.currentTimeMillis();
long difference = endTime - beginTime;

现在这个差异将是主进程总共所需的时间,包括另一个进程所需的时间。 这个时间是相对于主进程的机器的参考时间,这很好。


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