關於排列後數組的一些思考(1)

問題: stackoverflow上看到了一個問題數組排序以後更加再對其進行操做時間縮短了c++

對樓主的實例代碼進行了一下重構,代碼以下:數組

public class Main {

    public static void main(String[] args) {
        noSortedTime();

        sortedTime();

    }

    private static void noSortedTime() {
        int[] data = initialize();
        calculateTime(data);
    }

    public static int[] initialize() {
        int arraySize = 32768;
        int data[] = new int[arraySize];
        Random ran = new Random(0);
        for (int c = 0; c < arraySize; ++c) {
            data[c] = ran.nextInt() % 256;
        }
        return data;
    }

    private static void sortedTime() {
        int[] data = initialize();
        Arrays.sort(data);
        calculateTime(data);
    }

    private static void calculateTime(int[] data) {
        long start = System.nanoTime();
        long sum = 0;
        for (int i = 0; i < 100000; i++) {
            for (int c = 0; c < data.length; c++) {
                if (data[c] < 128) {
                    sum += data[c];
                }
            }
        }
        System.out.println((System.nanoTime() - start) / 1000000000.0);
        System.out.println("sum = " + sum);
    }
}
  1. 把up最高的回答看了下,也就是在loop的時候,在斷定if (data[c] > 128) 的時候,沒有排列時候,每次都要從新進行判斷,而排列完以後,當排列完數據大於128判斷時候,後面全部的數據都不須要進行if的判斷,由此減小了斷定方向,減小了運行時間,因爲128大概是255的通常左右,因此我當時的認爲應該時間也是通常左右,但獲得的誤差比較大,並且sum是負數,debug後發現ran.nextInt() % 256;可能產生負數,因而我把initialize()方法改爲了以下:dom

    public static int[] initialize() {
        int arraySize = 30000;
        int data[] = new int[arraySize];
        Random ran = new Random(0);
        for (int c = 0; c < arraySize; ++c) {
            int i = ran.nextInt() % 256;
            if (i > 0) {
                data[c] = i;
            } else {
                data[c] = -i;
            }   
        }
        return data;
    }
  2. 這時候,獲得告終果是:
    20.666892876
    sum = 95197000000
    9.225126652
    sum = 95197000000
    oop

  3. 以後我以爲若是以128做爲斷定條件太折中,若是是用極端點的條件來進行如小於1會不會排列好的數組會很是快的完成呢,或者大於254會不會兩邊的速度差很少呢,進行了實驗小於1的話獲得的結果是:
    8.647651855
    sum = 0
    8.641952252
    sum = 0
    大於254的結果是:
    8.942171349
    sum = 3111000000
    8.821620658
    sum = 3111000000
    debug

  4. 上述結果很明顯獲得咱們的猜測是錯誤的,我又從新去把回答up最高的答案仔細讀了一遍,發現了又Branch predictor這個概念,是處理器中對於if else這類condition的判斷預測,具體裏面的概念灰常不懂,只能先放着了。code

相關文章
相關標籤/搜索