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

23

我在互联网上看到应该使用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
        }
    }
}

我已经多次这样做了 - 外部循环执行了20次每次为k做一次操作,但结果并不好。有时候进行1000万次插入比1百万次还要快,因为我现在使用的不是正确的测量时间方法(System.nanoTime())。

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

编辑3:我可能在代码中做错了什么,我会看看更改是否能实现我想要的效果。

编辑4:我的错误,似乎System.nanoTime()可以工作。太好了。


Java的哪个版本?在我的XP机器上,使用JDK1.6.0_06,nanoTime()函数精度可以达到小数点后的最后一位。我猜测你的版本返回的值总是以三个零结尾。 - basszero
Sun JVM 不够,需要哪个版本?(你的答案是正确的,我没有问清楚问题。我假设每个人都使用 Sun JVM) - basszero
在cmd中输入Java -version,输出如下:java version "1.7.0-ea"还有另外两行。无论如何,这是我的代码错误。很抱歉,即使搜索了一段时间也找不到错误。 - jao
8
需要微秒级精度的基准测试不会非常准确。如果网络上的另一台机器恰好向您的计算机发送 ping,或者您移动鼠标等,微秒级时间测量就会受到最轻微的 CPU 负载干扰而产生噪音。 - Kip
这并不回答你的具体问题,但使用这个可能会使它变得不必要:http://code.google.com/p/caliper/ - TJR
显示剩余2条评论
12个回答

0

依赖于短时间间隔的基准测试会给出不可靠的结果。由于I/O、交换、进程切换、缓存、垃圾回收等外部因素,您将始终获得不同的结果。此外,JVM优化您的调用,因此第一次测量的事情可能比后来的调用慢。JVM越来越开始优化您执行的命令。

另外,像System.nanoTime()这样的方法取决于底层系统的计时器。它们可能(并且很可能)没有粒度以在那种精度下进行测量。引用API

该方法提供纳秒级精度,但不一定具有纳秒级精度。不保证值更改的频率。

要真正高精度地测量,您需要访问具有保证精度的外部计时硬件。

为了使您的基准测试更稳定,您需要执行多次,并测量大于仅毫秒的时间间隔。


0

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