【问题标题】:Measuring time differences using System.currentTimeMillis()使用 System.currentTimeMillis() 测量时差
【发布时间】:2012-10-25 05:48:27
【问题描述】:

我有一个简单的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 次操作并将结果取平均值应该会给您一个公平的估计。

标签: java time


【解决方案1】:

System.currentTimeMillis() 的粒度取决于实现和操作系统,通常在 10 毫秒左右。

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

例子:

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

【讨论】:

  • 感谢您的回答。粒度很重要,但我特别感兴趣的是,我当前的系统状态如何,以及这次的进程交错效果。
  • 计时器测量外部(“墙”)时间。如果您想要可重复的结果,请运行您的测试,而无需其他任何资源竞争。
  • 是的,当前系统负载和其他进程可能确实会影响结果。您测量的代码执行时间越长,它受到的影响就越大。例如,如果您的代码仅执行几个基本操作(如添加整数),则线程执行很可能不会被挂起。如果您的代码在一个循环中计算数千个数字的正弦值,则线程被挂起以允许其他进程在系统过载时运行的可能性要高得多。
  • 我看到 System.currentTimeMillis 与 nanoTime() 相比减少了多达 100 毫秒。不要使用 currentTimeMillis() 来衡量任何类型的性能。
【解决方案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;

现在这个差异将是主进程花费的总时间,包括另一个进程花费的时间。这个时间是参考主进程的机器的,没关系。

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多