Arrays 相同的排序算法,相同的数组,但对同一数组进行多次排序时,给出的排序时间不同
我试着在下面的程序中检查同一个算法是否在同一个数组上运行了几次,它会给出不同的排序时间。它返回不同的时间。为什么呢?我在所有尝试中都使用了相同的数组。 包装分拣Arrays 相同的排序算法,相同的数组,但对同一数组进行多次排序时,给出的排序时间不同,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我试着在下面的程序中检查同一个算法是否在同一个数组上运行了几次,它会给出不同的排序时间。它返回不同的时间。为什么呢?我在所有尝试中都使用了相同的数组。 包装分拣 import java.util.Arrays; import static sorting.CompareSorting.bubble_sort; import static sorting.CompareSorting.generate_data; public class Sorting { public static v
import java.util.Arrays;
import static sorting.CompareSorting.bubble_sort;
import static sorting.CompareSorting.generate_data;
public class Sorting {
public static void main(String [] args){
int size = 10000;
int [] arr = new int[size];
int [] arr1 = new int[size];
int [] arr2 = new int[size];
long startTime;
long endTime;
arr = generate_data(size);
System.arraycopy(arr, 0, arr1, 0, size);
System.arraycopy(arr, 0, arr2, 0, size);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
startTime = System.currentTimeMillis();
bubble_sort(arr);
endTime = System.currentTimeMillis();
System.out.println("1st attempt " + (endTime - startTime));
startTime = System.currentTimeMillis();
bubble_sort(arr1);
endTime = System.currentTimeMillis();
System.out.println("2nd attempt " + (endTime - startTime));
startTime = System.currentTimeMillis();
bubble_sort(arr2);
endTime = System.currentTimeMillis();
System.out.println("3rd attempt " + (endTime - startTime));
}
}
这是排序方法
static void bubble_sort(int [] data) {
int i,j,tmp;
for(i = data.length ; i >= 0 ; i-- ){
for(j = 0 ; j < data.length - 1 ; j++ ){
if(data[j] > data[j + 1]){
tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
}
}
}
}
staticvoidbubble\u排序(int[]数据){
int i,j,tmp;
对于(i=data.length;i>=0;i--){
对于(j=0;j数据[j+1]){
tmp=数据[j];
数据[j]=数据[j+1];
数据[j+1]=tmp;
}
}
}
}
返回值:
第一次尝试438
第二次尝试359
第三次尝试297Java使用JVM(Jav虚拟机)运行我们用Java开发的应用程序。一旦代码运行,它就会对代码进行优化。因此,当您尝试对数组进行三到四次排序时,它会优化代码,从而减少运行时间。
签出和这不是用Java进行基准测试的正确方法。你们可以在这里读到更多关于它的内容:(1)你们需要在实验前进行适当的热身。(2) JIT编译更可能在以后运行时已经优化了部分代码(预热的原因之一)(3)一次运行说明不了什么,当试图根据经验确定“哪个更好”时,您应该使用统计工具,在知道结果之前不要试图理解任何东西。所以编译器会优化并识别模式吗?这就是我检查每个实例时缩短时间的原因吗?顺便说一句,谢谢克拉斯科维奇和amit@DinaJIT是即时编译,它由虚拟机(运行编译的字节码)实现,并尝试优化经常重复的代码片段。这是在运行时完成的。在非硬实时系统上,运行时间是不确定的。因为系统同时忙于做许多其他事情,并且内存访问遵循一种极其复杂的不可重复的行为。谢谢Thisaru的回答:)