我在互联网上看到我应该使用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
}
}
}我这样做了很多次-有一个外部循环为每个k做了20次-但结果并不好。有时进行1000万次插入所需的时间比100万次要少,因为我现在使用的时间(System.nanoTime())得不到正确的测量时间。
编辑2:是的,我使用的是Sun JVM。
编辑3:我可能在代码中做了一些错误的事情,我会看看修改它是否如我所愿。
编辑4:我的错误,似乎System.nanoTime()起作用了。呼。
发布于 2009-02-02 17:02:21
我的猜测是,由于System.nanoTime()使用的是“最精确的可用系统计时器”,显然它在你的系统上只有毫秒精度,所以你不能得到更好的计时器了。
发布于 2009-02-02 16:55:25
我不清楚你到底在做什么基准测试,但一般来说,任何运行时间如此之短的测试,其准确度低于50ms是相关的,将非常容易受到其他干扰。
我通常会尝试让基准测试运行至少10秒。我目前正在编写的框架将猜测运行多少次迭代,因此需要30秒。这意味着你不会因为其他进程窃取了几毫秒的CPU而得到截然不同的结果。
运行更长时间的几乎总是一种更好的方法,而不是试图以更细粒度的精度进行测量。
发布于 2009-02-02 17:17:27
System.nanoTime()在中央处理器中使用计数器,在Windows XP和Linux上通常精确到1微秒。
注意: Windows XP在多cpu计算机上通常不太准确,因为它不会补偿具有不同计数器的不同cpu。Linux就是这样。注2:它将相对于System.currentTimeMillis()进行漂移,因为它基于CPU的时钟精度(在一段时间内不需要如此精确),而不是您获取时间的时钟(每天漂移较少,但粒度较小)。
在您的基准测试中,您基本上是在测试创建新对象的速度。毫不奇怪,您的结果将根据GC设置和最近执行GC的时间长短而显着不同。
尝试使用以下选项运行测试,您应该会看到截然不同的结果。
-verbosegc -XX:NewSize=128m -mx256mhttps://stackoverflow.com/questions/503877
复制相似问题