Я выполнил короткий тест на длинном массиве в java с довольно странными результатами. Кажется, что последовательные чтения со случайными записями быстрее - в полтора раза - чем случайные чтения с последовательной записью. Кто-нибудь подсказывает, почему?
Вот два метода, которые записывают массив из нескольких длин (запускается с -Xmx2G или около того) случайным образом, когда вы читаете последовательно и читаете последовательно при записи случайным образом:
import java.util.Random;
public class Scratch {
static Random random = new Random();
static long[] arr = new long[100000000];
static void seqReadRandWrite() {
    for(int i=0;i<arr.length;i++) {
        int at = random.nextInt(arr.length);
        arr[at] = arr[i];
    }
}
static void seqWriteRandRead() {
    for(int i=0;i<arr.length;i++) {
        int at = random.nextInt(arr.length);
        arr[i] = arr[at];
    }
}
public static void main(String[] args) throws Exception {
    seqWriteRandRead(); // warm up
    long nanos = System.nanoTime();
    seqReadRandWrite();
    System.out.println("Time: " + (System.nanoTime()-nanos) + "ns");
    nanos = System.nanoTime();
    seqWriteRandRead();
    System.out.println("Time: " + (System.nanoTime()-nanos) + "ns");
}
}
результаты на моем ноутбуке
Время: 2774662168ns
Время: 6059499068ns
Это означает, что он в два раза быстрее записывается случайным образом по сравнению с чтением.. или? Разве мой ноутбук сломан?
ps: это не претендует на то, чтобы быть эталоном, хотя большинство пунктов в связанных советах относительно бенчмаркинга охвачены. Даже если я запускаю уже 200 000 000 операций несколько раз, рестаты остаются довольно постоянными. Кажется (кажется!), Что перемещение памяти из случайных позиций в последовательные блоки происходит медленнее, чем перемещение памяти из последовательных позиций в случайные блоки, по крайней мере, с памятью этого размера и вышеописанным способом ее выполнения. и мне интересно, почему?
