gpt4 book ai didi

java - 基本的插入排序优化使代码变慢

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:02 24 4
gpt4 key购买 nike

我明天要教插入排序的演示。一个重要的优化是向内部循环添加一个检查,一旦你将一个项目放到正确的位置,它就会停止迭代。所以基本上,它是从这里开始的:

public static void insertionSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = i; j > 0; j--) {
if (array[j] < array[j-1]) {
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}
}

为此:

public static void insertionSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = i; j > 0 && array[j] < array[j-1]; j--) {
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}

第二个版本应该更有效率。但是,当我对其进行基准测试时,我实际上是在测量第一个版本的性能是否更快。我找不到错误。知道发生了什么事吗?

这是我用来进行基准测试的代码:

import java.util.Arrays;
import java.util.Random;

public class InsertionSort {
public static void main(String[] args) {
int[] stuff = getRandomArray(50000);
//System.out.println(Arrays.toString(stuff));

long started = System.currentTimeMillis();
insertionSort(stuff);
long finished = System.currentTimeMillis();
long totalTime = finished - started;

//System.out.println(Arrays.toString(stuff));

System.out.println("Started: " + started);
System.out.println("Finished: " + finished);
System.out.println("Elapsed: " + totalTime);
}

public static int[] getRandomArray(int size) {
int[] array = new int[size];
Random r = new Random();
for (int i = 0; i < array.length; i++) {
array[i] = r.nextInt(size);
}
return array;
}

public static void insertionSort(int[] array) {
// Implementation goes here
}
}

编辑:更改测试数组中的项目数,并注释掉要打印的行

最佳答案

首先,您已经编写了所谓的微基准测试。您的结果没有意义,因为您没有预热阶段。这对于让 JVM HotSpot 编译器执行其运行时优化至关重要。

搜索“java microbenchmark”找到一些工具。一个例子是 http://java-performance.info/jmh/

以防万一你的结果有意义,我想在你的第二个例子中,HotSpot 编译器的循环优化不如你的第一个例子中的那样有效。

关于java - 基本的插入排序优化使代码变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29026842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com