Я выполнил короткий тест на длинном массиве в 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 операций несколько раз, рестаты остаются довольно постоянными. Кажется (кажется!), Что перемещение памяти из случайных позиций в последовательные блоки происходит медленнее, чем перемещение памяти из последовательных позиций в случайные блоки, по крайней мере, с памятью этого размера и вышеописанным способом ее выполнения. и мне интересно, почему?