如何在Java中以微秒精度测量时间?

21 java time

我在互联网上看到我应该使用System.nanoTime(),但这对我不起作用 - 它给了我毫秒精度的时间.我只需要在我的函数执行之前和之后的微秒,这样我就知道需要多长时间.我正在使用Windows XP.

基本上,我有这样的代码,例如,在java链表中进行了100万到1000万次插入.问题是我无法衡量精确度; 有时在较小的列表中插入所有内容所需的时间较少.

这是一个例子:

class test
{
    public static void main(String args[])
    {
        for(int k=1000000; k<=10000000; k+=1000000)
        {
            System.out.println(k);
            LinkedList<Integer> aux = new LinkedList<Integer>();
            //need something here to see the start time
            for(int i=0; i<k; i++)
                aux.addFirst(10000);
            //need something here to see the end time
            //print here the difference between both times
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做了很多次 - 每个k都有一个外部循环做20次 - 但结果并不好.有时需要更少的时间来进行1000万次插入而不是100万次插入,因为我没有使用我现在使用的内容获得正确的测量时间(System.nanoTime())

编辑2:是的,我正在使用Sun JVM.

编辑3:我可能在代码中做错了什么,我会看看改变它是否符合我的要求.

编辑4:我的错误,似乎System.nanoTime()工作.唷.

Zac*_*ena 31

我的猜测是,因为System.nanoTime()使用"最精确的可用系统计时器",显然只有毫秒精度的系统,你不能得到更好的东西.


Jon*_*eet 25

我不清楚你究竟是什么基准测试,但一般来说,任何需要花费这么短时间才能运行的测试,相关的精度低于50毫秒,将非常容易受到其他干扰.

我通常会尝试使基准测试运行至少10秒.我正在编写的框架将猜测要运行多少次迭代,这将需要30秒.这意味着你不会因为其他一些进程偷走CPU几毫秒而得到截然不同的结果.

运行更长时间几乎总是比尝试以更细粒度的精度进行测量更好的方法.


Bas*_*que 8

使用java.time

\n

仅供参考,Java 9 及更高版本有一个新的实现Clock,可以以高达纳秒的分辨率捕获当前时刻。

\n

该类表示UTCInstant时间线上的时刻,分辨率为纳秒(最多九 (9) 位小数)。

\n

拨打电话Instant.now以捕捉当前时刻。

\n
    \n
  • 在 Java 9 及更高版本中,您可以获得当前时刻高达纳秒的分辨率。
  • \n
  • 在 Java 8 中,当前时刻的捕获精度最高为毫秒(您确实可以保存纳秒级的值,但只能捕获以毫秒为单位的当前时刻)。
  • \n
\n

代码:

\n
Instant instant = Instant.now() ;\n
Run Code Online (Sandbox Code Playgroud)\n

表示与课程时间线无关的一段时间Duration。保存以秒和纳秒为单位的时间量。

\n
Duration d = Duration.between( instantThen , Instant.now() );\n
Run Code Online (Sandbox Code Playgroud)\n

需要明确的是,问题中要求的微秒分辨率介于毫秒和纳秒之间。小数位数:毫为 3 (0.123),微米为 6 (0.123456),纳为 9 (0.123456789)。

\n

警告

\n

Java 依赖于您的计算机\xe2\x80\x99s 硬件时钟。正如其他人警告的那样,硬件几乎肯定会以比纳秒低得多的精度分辨率来捕获时间。

\n

如此细粒度的基准测试充满了问题,通常不建议这样做

\n

并谨防过早的优化

\n

JEP 230:Microbenchmark Suite中建议向 Java 平台添加微基准测试工具。基于Java Microbenchmark Harness (JMH)

\n
\n

关于 java.time

\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n

从哪里获取 java.time 类?

\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n