我在 java 中的一个长数组上执行了一个简短的基准测试,结果非常奇怪。似乎带有随机写入的顺序读取比带有顺序写入的随机读取要快 - 一半的时间。有没有人知道为什么?
以下是两种方法,它们在顺序读取时随机写入一些 long 数组(使用 -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 次操作,结果仍然保持不变。似乎(似乎!)将内存从随机位置移动到顺序块比将内存从顺序位置移动到随机块慢,至少在这种大小的内存和上述执行方式的情况下。我想知道为什么?