在Java中,bubblesort的运行时间不同
我已经创建了一个新的冒泡排序项目,我想知道它需要多少时间。因此,我添加了一个getTime方法,它返回nanotime。我还创建了一个包含9个静态值的数组。当我运行我的代码时,我得到不同的运行时间,即:通常我得到3849纳秒,但有时是6432或4277纳秒。这怎么可能 我的代码如下:在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
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文档有关:。。。该方法提供纳秒精度,但不一定是纳秒精度。无法保证值的更改频率。。。。看看这个: