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

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

基本上,我有这样的代码,例如,在Java链接列表中有100万到10百万的插入。 问题是我无法测量精确度; 有时候将更少的时间插入到较小的列表中。

这是一个例子:

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
        }
    }
}

我做了很多次 - 每个k有一个外部循环做了20次 - 但结果并不好。 有时需要花费更少的时间才能完成1000万次插入,因为我没有获得正确的测量时间(System.nanoTime())

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

编辑3:我可能在代码中做了一些错误,我会看看是否改变它做我想要的。

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


我的猜测是,由于System.nanoTime()使用“最精确的可用系统定时器”,它显然在系统上只有毫秒精度,所以你不能得到任何更好的结果。


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

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

运行更长的时间几乎总是比试图用更精细的粒度进行测量更好的方法。


System.nanoTime()在CPU中使用计数器,在Windows XP和Linux上通常精确到1微秒。

注意:在多CPU计算机上,Windows XP通常不太准确,因为它不会补偿具有不同计数器的不同CPU。 Linux的确如此。 注2:它会相对于System.currentTimeMillis()漂移,因为它基于CPU的时钟精度(在一段时间内不需要如此精确),而不是您拥有的时钟为了获得时间(每天漂移较少,但粒度较小)

在您的基准测试中,您基本上正在测试您可以创建新对象的速度。 毫不奇怪,根据您的GC设置以及最近执行的GC的结果,您的结果将会有很大不同。

尝试使用以下选项运行测试,您应该看到完全不同的结果。

-verbosegc -XX:NewSize = 128m -mx256m

链接地址: http://www.djcxy.com/p/15179.html

上一篇: How can I measure time with microsecond precision in Java?

下一篇: Is stopwatch benchmarking acceptable?