繁体   English   中英

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

[英]Why am I getting weird runtime in Java?

我有一个使用 quickSort 算法对数组 [500000] 进行排序的项目,我已经实现了这样的 quickSort:

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;
    }

所以我检查它; 首先,我使用其他一些类(无需发布)创建包含500000 个元素的数组,然后我获得该数组的副本,以便能够再次将其用作未排序的。 当我将第一个数组传递给第一个对象并计算运行时,我得到大约 300 毫秒的时间,但是当我对第二个数组(第一个未排序数组的副本)进行排序时,我得到大约 150000 毫秒的时间。 问题是; 为什么这两个由一个类组成的对象在非常不同的时间对同一个数组进行排序? 请注意,我同时使用了System.currentTimeMillies(); System.nanoTime(); , 没有不同。 也在 linux 和 Window 上运行它,再次没有区别。

编辑: 主类:

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

这不会复制数组:

var copiedArray = array;

它所做的是声明另一个指向同一个数组的变量。 在已经排序的数组上运行快速排序通常很慢

在 Java 中实际复制数组,您需要执行以下操作,例如:

var copiedArray = Arrays.copyOf(array, array.length);

任何剩余的时间差异都可能是由于 JIT 优化造成的。 使用像JMH这样的基准测试系统来解释它们。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM