【发布时间】:2010-10-04 23:16:21
【问题描述】:
我在 Internet 上看到我应该使用 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() 有效。唷。
【问题讨论】:
-
什么版本的Java?在我的带有 JDK1.6.0_06 的 XP 机器上,nanoTime() 精确到最后一个小数位。我假设您的版本返回的值总是以三个零结尾。
-
Sun JVM 不够用,哪个版本的呢? (你的回答是正确的,我没有问正确的问题。我假设每个人都使用 Sun JVM)
-
cmd 中的 Java -version 给了我: java version "1.7.0-ea" 和另外 2 行。无论哪种方式,这都是我的代码中的错误。抱歉,我搜索了一段时间也找不到错误。
-
勇敢的灵魂,1.7 还为时过早
-
需要微秒精度的基准测试不会非常准确。如果您网络上的另一台机器碰巧 ping 您的盒子,如果您移动鼠标等,您可以在微秒时间测量中添加噪声,只需一点额外的 CPU 负载。