为什么我会在Java中遇到奇怪的运行时?

为什么我会在Java中遇到奇怪的运行时?,java,algorithm,data-structures,runtime,Java,Algorithm,Data Structures,Runtime,我有一个使用快速排序算法对数组[500000]进行排序的项目, 我实现了如下快速排序: public void sort (int[] array){ sort(array, 0, array.length - 1); } private void sort (int[] array, int start, int end){ if (start >= end) { return; } va

我有一个使用快速排序算法对数组[500000]进行排序的项目, 我实现了如下快速排序:

public void sort (int[] array){
        sort(array, 0, array.length - 1);
    }

private void sort (int[] array, int start, int end){
        if (start >= end) {
            return;
        }

        var boundary = partition(array, start, end);
        sort(array, start, boundary - 1);
        sort(array, boundary + 1, end);
    }

    private int partition(int[] array, int start, int end){
        var pivot = array[end];
        var boundary = start - 1;
        for (int i = start; i <= end; i++)
            if (array[i] <= pivot)
                swap(array, i, ++boundary);

        return boundary;
    }

    private void swap(int[] array, int index1, int index2){
        var temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }


这不会复制阵列:

var copiedaray=数组;
它所做的是声明另一个指向相同数组的变量。 在已排序的数组上运行快速排序

实际上,您需要执行以下操作,例如:

var copiedArray=Arrays.copyOf(array,array.length);
任何剩余的时间差异都可能是由于JIT优化造成的。使用一个基准系统来解释它们

编辑:

现在您已经将其更改为两个不同的随机数组,因此运行时的差异现在是由于元素不同。

Benchmark.NET?这在java世界不是一件事,也许@Fildor认为这是一个C#问题。正确的基准测试工具是。您确定已复制阵列吗?在已经排序的数组上运行快速排序可能非常慢。与其描述它,不如发布代码。什么是“第一个对象”?它有什么作用?它对数组进行排序吗?用什么方法?如果您发布一个,我们将能够亲自查看您是否真的在复制数组,其他对象是否做了比您想象的更聪明的事情等等。设置
startTime
并仅在
sort(int[]array)
中计算时间跨度会更干净。当前,如果重用sorter类的实例,它将使用实例创建时的开始时间(因为这是设置
startTime
时的开始时间),而不是开始排序时的开始时间。因此,该实例执行的每个后续排序似乎都比前一个要花费更长的时间。@OrangeDog;是的,我抄了。你可以在我发布的主类中看到。
public static void main(String[] args) {
        
        var arrayBuilder = new ArrayBuilder();
        var firstArray = arrayBuilder.getArray();
        var secondArray = arrayBuilder.getArray();
        
        var quickSort1 = new QuickSort();
        long firstSortStart = System.nanoTime();
        quickSort1.sort(firstArray);
        long firstSortEnd = System.nanoTime();
        long firstSortTotal = firstSortEnd - firstSortStart;
        System.out.format("Original QuickSort (Version 1) took %d nano seconds. \n", firstSortTotal);
        
        var quickSort2 = new QuickSort();
        long secondSortStart = System.nanoTime();
        quickSort2.sort(secondArray);
        long secondSortEnd = System.nanoTime();
        long secondSortTotal = secondSortEnd - secondSortStart;
        System.out.format("Changed QuickSort (Version 2) took %d nano seconds. \n", secondSortTotal);
//      this takes ~183861470 nano seconds
        quickSorter2.sort(copiedArray);
//      this takes ~218316931575 nano secondes