2013-03-17 35 views
1

我已经创建了一个新的冒泡排序项目,我想知道它需要多少时间。因此,我添加了一个getTime()方法,该方法返回nanotime。我也创建了一个具有9个静态值的数组。当我运行我的代码时,我得到不同的运行时间(即:通常我得到3849 ns,但有时6432或4277 ns)。怎么会这样?我在Java中获得bubblesort的不同运行时间

我的代码如下:

long time2; 
public void sort(int[] dizi){ 
    long time = System.nanoTime(); 
    for (int i = dizi.length-1; i >0; i--) { 
     for (int j = 0; j < i; j++) { 
      if(dizi[j]>dizi[j+1]){ 
       super.swap(dizi, j, j+1); 
      } 
     } 
    } 
    time2 = System.nanoTime() - time; 
} 
public long getTime(long time){ 
     return time; 
} 
main(){ 
     BubbleSort bubbleSort = new BubbleSort(); 
     int[] arr = {4,2,1,8,9,5,3,7,6}; 
     bubbleSort.sort(arr); 
     Sysout(bubbleSort.getTime(time2)); 
} 
+4

可以有很多的变数,可能会导致你的时间是不同的,如JVM进行垃圾收集,您的操作系统执行一些其他任务等。 – blamonet 2013-03-17 23:49:12

+1

展开您的阵列到10万以上。 – yehe 2013-03-17 23:53:22

+0

复活节兔:什么都没有改变,我的第一次审判13204534055秒13230923476 blamonet:如果我看到真实的)这种情况与我的系统和System.nanoTime(正常的异常 – 2013-03-18 00:00:15

回答

0

有多种因素可能会影响结果。

JVM可能会开始运行垃圾回收(这绝对不是你的情况),在运行你的程序时,JVM可能会分配一些内存,而底层的OS服务发现它应该交换一些内存,因为它已经用完了可用的RAM, etc ...

没有可用的JVM(适用于Mac,Windows和Linux/Unix)在实时系统上运行,但即使有一天它会执行 - 您的JVM可能会决定您的程序的优先级低于某些JVM活动。

尝试一些啤酒阵,结果将更加稳定。

0

除非你正在运行的硬件可以准确地测量纳秒(提示 - 它不能),没有办法对Java给你一个准确的时间戳以ns计。

最重要的是,Java是不确定性的方面运行的代码的时间。在任何时候,您的代码都可能被JVM正在运行的大量其他内务管理任务中断,最显着的是垃圾收集。

还有热点编译器,它将识别一段经常运行的字节代码,并且会立即将其重新编译为本地代码,这会导致暂停,但随后的运行性能会得到改善。如果您想从公式中移除热点效应,您需要通过运行代码几万次以确保代码被编译为本机代码来测试代码,然后执行实际的定时运行以查看代码的效率如何。

您所看到的最终结果是,代码可以运行多次,产生相同的结果,但需要不同的时间来返回该结果,而且对于任何地方的OCD编码器来说,坏消息都是您永远不会做出来的每次测试运行的数量都相同。对于像这样的性能测试,我通常希望运行代码的次数可能是1,000次,并记录最快时间,最慢时间,平均时间和标准偏差,以便准确了解特定作品的运行时间的代码。如果我收到意想不到的缓慢运行,然后在虚拟机上启用详细的GC选项时,我会在日志中查找完整的GC事件。

哦,不要忘记你的JVM上运行的操作系统是运行时提供一个可变量过多时,OS看家TAKS实在是太运行。