У меня есть ноутбук с процессором Intel Core 2 Duo с тактовой частотой 2,4 ГГц и 2x4Gb DDR3 модулями 1066 МГц.Программа, превышающая теоретическую скорость передачи памяти
Я ожидаю, что это эта память может работать на скорости 1067 МиБ/с, и до тех пор, пока два канала, максимальная скорость 2134 MiB/сек (в случае, если ОС диспетчеру памяти позволит).
Я сделал крошечный приложение Java, чтобы проверить, что:
private static final int size = 256 * 1024 * 1024; // 256 Mb
private static final byte[] storage = new byte[size];
private static final int s = 1024; // 1Kb
private static final int duration = 10; // 10sec
public static void main(String[] args) {
long start = System.currentTimeMillis();
Random rnd = new Random();
byte[] buf1 = new byte[s];
rnd.nextBytes(buf1);
long count = 0;
while (System.currentTimeMillis() - start < duration * 1000) {
long begin = (long) (rnd.nextDouble() * (size - s));
System.arraycopy(buf1, 0, storage, (int) begin, s);
++count;
}
double totalSeconds = (System.currentTimeMillis() - start)/1000.0;
double speed = count * s/totalSeconds/1024/1024;
System.out.println(count * s + " bytes transferred in " + totalSeconds + " secs (" + speed + " MiB/sec)");
byte[] buf2 = new byte[s];
count = 0;
start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < duration * 1000) {
long begin = (long) (rnd.nextDouble() * (size - s));
System.arraycopy(storage, (int) begin, buf2, 0, s);
Arrays.fill(buf2, (byte) 0);
++count;
}
totalSeconds = (System.currentTimeMillis() - start)/1000.0;
speed = count * s/totalSeconds/1024/1024;
System.out.println(count * s + " bytes transferred in " + totalSeconds + " secs (" + speed + " MiB/sec)");
}
Я ожидал, что результат будет под 2134 МиБ/с, однако я получил следующее:
17530212352 bytes transferred in 10.0 secs (1671.811328125 MiB/sec)
31237926912 bytes transferred in 10.0 secs (2979.080859375 MiB/sec)
Как это возможно эта скорость была почти 3 гигабайта/сек?
вы забыли кеш процессора. есть l1, l2 и даже l3-кеш ... просто потому, что вы случайно звоняете, не означает, что вам не удастся получить хит в кеше. –
тактовая частота DDR не интерпретируется так: – HuStmpHrrr
@MarcB Правильно. Вот почему я создаю буферное хранилище 256 Мбайт. – Antonio