1

質問を読んだ後、ソートされた配列の処理がソートされていない配列よりも速いのはなぜですか? 変数を volatile にしようとしました (volatile を使用すると動作が遅くなるはずですが、動作は速くなると予想していました) volatile を使用しないコードは次のとおりです: (動作時間は約 11 秒です。)

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

public class GGGG {

public static void main(String[] args) {
    int arraySize = 32768;
    int data[];
    data = new int[arraySize];

    Random rnd = new Random(0);
    for (int c = 0; c < arraySize; ++c) {
        data[c] = rnd.nextInt() % 256;
    }

    Arrays.sort(data);

    long start = System.nanoTime();
    long sum = 0;

    for (int i = 0; i < 200000; ++i) {
        for (int c = 0; c < arraySize; ++c) {
            if (data[c] >= 128) {
                sum += data[c];
            }
        }
    }

    System.out.println((System.nanoTime() - start) / 1000000000.0);
    System.out.println("sum = " + sum);

    System.out.println("=========================");
}

出力は次のとおりです。

10.876173341
sum = 310368400000
=========================



これは、arraySize とデータ変数を揮発性として使用した場合で、約 7 秒で動作します。

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

public class GGGG {

static volatile int arraySize = 32768;
static volatile int data[];

public static void main(String[] args) {
    data = new int[arraySize];

    Random rnd = new Random(0);
    for (int c = 0; c < arraySize; ++c) {
        data[c] = rnd.nextInt() % 256;
    }

    Arrays.sort(data);

    long start = System.nanoTime();
    long sum = 0;

    for (int i = 0; i < 200000; ++i) {
        for (int c = 0; c < arraySize; ++c) {
            if (data[c] >= 128) {
                sum += data[c];
            }
        }
    }

    System.out.println((System.nanoTime() - start) / 1000000000.0);
    System.out.println("sum = " + sum);

    System.out.println("=========================");
}

volatile を使用した出力は次のとおりです。

6.776267265
sum = 310368400000
=========================

揮発性でプロセスが遅くなると思っていたのですが、より速く動作しています。何が起こったか?

4

1 に答える 1