Java 自定义排序算法性能(vs Arrays.sort()和parallelSort())
我用Java实现了一个基本的排序算法,并将其性能与本机方法(Arrays.sort()和Arrays.parallelSort())进行了比较。节目如下Java 自定义排序算法性能(vs Arrays.sort()和parallelSort()),java,arrays,sorting,Java,Arrays,Sorting,我用Java实现了一个基本的排序算法,并将其性能与本机方法(Arrays.sort()和Arrays.parallelSort())进行了比较。节目如下 public static void main(String[] args) { // Randomly populate array int[] array = new int[999999]; for (int i = 0; i < 999999; i++) array[i] = (int)M
public static void main(String[] args) {
// Randomly populate array
int[] array = new int[999999];
for (int i = 0; i < 999999; i++)
array[i] = (int)Math.ceil(Math.random() * 100);
long start, end;
start = System.currentTimeMillis();
Arrays.sort(array);
end = System.currentTimeMillis();
System.out.println("======= Arrays.sort: done in " + (end - start) + " ms ========");
start = System.currentTimeMillis();
Arrays.parallelSort(array);
end = System.currentTimeMillis();
System.out.println("======= Arrays.parallelSort: done in " + (end - start) + " ms ========");
start = System.currentTimeMillis();
orderArray(array);
end = System.currentTimeMillis();
System.out.println("======= My way: done in " + (end - start) + " ms ========");
}
private static int[] orderArray(int[] arrayToOrder) {
for (int i = 1; i < arrayToOrder.length; i++) {
int currentElementIndex = i;
while (currentElementIndex > 0 && arrayToOrder[currentElementIndex] < arrayToOrder[currentElementIndex-1]) {
int temp = arrayToOrder[currentElementIndex];
arrayToOrder[currentElementIndex] = arrayToOrder[currentElementIndex-1];
arrayToOrder[currentElementIndex-1] = temp;
currentElementIndex--;
}
}
return arrayToOrder;
}
这独立于:
- 数组中的元素数(在我的示例中为999999)
- 执行排序的次数(我在for循环中尝试并迭代了很多次)
- 数据类型(我尝试使用double数组而不是int数组,没有发现任何差异)
- 我调用每个排序算法的顺序(不影响性能的总体差异)
- 我衡量绩效的方式存在缺陷
- 我的算法太简单,缺少一些角点情况
Chris。您正在对一个数组进行排序,但没有在每个轨迹之间对数组进行置乱。这意味着您正在对最佳情况进行排序。在每次调用数组排序方法之间,可以重新创建数组
for (int i = 0; i < TEST_SIZE; i++)
array[i] = (int)Math.ceil(Math.random() * 100);
for(int i=0;i
完成此操作后,您会注意到您的算法大约慢100倍
也就是说,这并不是比较这些方法的最佳方法。至少,您应该为每个不同的算法对相同的原始数组进行排序。您还应该对每个算法执行多次迭代,并平均响应。单次试验的结果是虚假的,作为一个好的比较是不可靠的 您正在对阵列进行适当排序,但没有在每个轨迹之间对阵列进行置乱。这意味着您正在对最佳情况进行排序。在每次调用数组排序方法之间,可以重新创建数组
for (int i = 0; i < TEST_SIZE; i++)
array[i] = (int)Math.ceil(Math.random() * 100);
for(int i=0;i
完成此操作后,您会注意到您的算法大约慢100倍
也就是说,这并不是比较这些方法的最佳方法。至少,您应该为每个不同的算法对相同的原始数组进行排序。您还应该对每个算法执行多次迭代,并平均响应。单次试验的结果是虚假的,作为一个好的比较是不可靠的 您正在对数组进行排序,但没有在每个轨迹之间对数组进行置乱。可能的重复意味着:您在第一次排序调用后对已排序的数组进行排序。注意:您需要确保代码已预热。我将重复运行此操作,直到代码不再预热。e、 g.多次运行整套测试,忽略前30-120秒。当您第一次运行代码时,它会在运行一段时间后进行解释,例如10000个循环,它会在后台分一两个阶段编译为本机代码。只有在代码完全编译成本机代码后,您才能看到它的速度有多快,但您没有在每个轨迹之间对数组进行重新置乱。可能的重复意味着:您在第一次排序调用后对已排序的数组进行排序。注意:您需要确保代码已预热。我将反复运行此操作,直到代码不再预热。e、 g.多次运行整套测试,忽略前30-120秒。当您第一次运行代码时,它会在运行一段时间后进行解释,例如10000个循环,它会在后台分一两个阶段编译为本机代码。只有在代码完全编译成本机代码后,您才能看到它的速度有多快。好吧,奇怪的是,我确信调用每个算法的顺序对基准测试没有影响。。。但现在我实现了排序之间的数组置乱,基准测试确实与您描述的匹配。正如你所说,对每个算法的相同原始数组进行排序也是有意义的,真不敢相信我没有想到。。。谢谢你的回答。好吧,奇怪的是,我确信我调用每个算法的顺序对基准测试没有影响。。。但现在我实现了排序之间的数组置乱,基准测试确实与您描述的匹配。正如你所说,对每个算法的相同原始数组进行排序也是有意义的,真不敢相信我没有想到。。。谢谢你的回答。