Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,bubblesort的运行时间不同_Java_Bubble Sort - Fatal编程技术网

在Java中,bubblesort的运行时间不同

在Java中,bubblesort的运行时间不同,java,bubble-sort,Java,Bubble Sort,我已经创建了一个新的冒泡排序项目,我想知道它需要多少时间。因此,我添加了一个getTime方法,它返回nanotime。我还创建了一个包含9个静态值的数组。当我运行我的代码时,我得到不同的运行时间,即:通常我得到3849纳秒,但有时是6432或4277纳秒。这怎么可能 我的代码如下: long time2; public void sort(int[] dizi){ long time = System.nanoTime(); for (int i = dizi.length-1

我已经创建了一个新的冒泡排序项目,我想知道它需要多少时间。因此,我添加了一个getTime方法,它返回nanotime。我还创建了一个包含9个静态值的数组。当我运行我的代码时,我得到不同的运行时间,即:通常我得到3849纳秒,但有时是6432或4277纳秒。这怎么可能

我的代码如下:

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

除非您正在运行的硬件能够精确地测量纳秒,否则Java无法以纳秒为单位为您提供准确的时间戳

除此之外,Java在代码的运行时间方面是不确定的。在任何时候,您的代码都可能被JVM正在运行的大量其他内部维护任务打断,最明显的是垃圾收集

还有热点编译器,它将识别一段经常运行的字节码,并将其动态重新编译为本机代码,这会导致暂停,但在以后的运行中性能会得到提高。如果您想从等式中消除热点效应,您需要通过运行代码数万次来测试代码,以确保它已编译为本机代码,然后执行实际的定时运行以查看代码的效率

正如您所看到的,最终的结果是代码可以运行多次,产生相同的结果,但返回结果所需的时间不同,而对于各地的OCD编码人员来说,坏消息是,您永远不会使每次测试运行的数字相同

对于这样的性能测试,我通常希望运行代码1000次,并在计时中记录最快时间、最慢时间、平均时间和标准偏差,以准确了解特定代码段的运行时间。如果出现意外的慢速运行,那么当在VM上启用详细GC选项时,我会在日志中查找完整GC事件


哦,别忘了运行JVM的操作系统也提供了可变的运行时间,该操作系统也有其运行的内部管理任务。

有多个因素可能会影响结果

JVM可能会开始运行垃圾收集,这绝对不是你的情况,而运行你的程序JVM可能会分配一些内存,底层操作系统服务会发现它应该交换一些内存,因为它已经用完了可用的RAM,等等

没有适用于Mac、Windows和Linux/Unix的可用JVM在实时系统上运行,但即使有一天它运行了,您的JVM可能会认为您的程序的优先级低于某些JVM活动


尝试一些更大的数组,结果会更稳定。

可能有很多变量会导致您的时间不同,例如JVM执行垃圾收集、操作系统执行其他任务等。将数组扩展到100000或更大。easterbunny:没有更改,第一次是我的试用版13204534055第二次是13230923476 Burmonet:如果我看到是真的,这种情况与我的系统和system.nanoTime的一个正常异常Java文档有关:。。。该方法提供纳秒精度,但不一定是纳秒精度。无法保证值的更改频率。。。。看看这个: