簡體   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