Подкачанная виртуальная память: почему второй шаг вдруг стал быстрее?
В этой программе есть матрица 128 х 128 целых чисел. На первом этапе мы меняем каждый элемент на 1. На втором этапе мы меняем каждый элемент на 2. Если мы сравним время, необходимое для этих шагов, то увидим, что Шаг 2 намного быстрее, чем Шаг 1, Когда мы меняем длину матрицы. Это различие начинается с 512x512 и становится более значительным, когда мы меняем его на 1024,2000... Как это можно объяснить?
public class PagingTest { private static int size = 128; // 128, 1024, 8192, ... private static long start, stop; private static int[][] data; public static void main (String[] args) { if(args.length > 0) { size = Integer.parseInt(args[0]); } data = new int[size][size]; System.out.println("Updating " + size + " x " + size + " array ... "); start = System.nanoTime(); for(int j = 0; j < size; j++) { for(int i = 0; i < size; i++) { data[i][j] = 1; } } stop = System.nanoTime(); System.out.println(" step 1: " + (stop - start) + " nanoseconds"); start = System.nanoTime(); for(int i = 0; i < size; i++) { for(int j = 0; j < size; j++) { data[i][j] = 2; } } stop = System.nanoTime(); System.out.println(" step 2: " + (stop - start) + " nanoseconds"); } }
Что я уже пробовал:
Я пробовал запускать программу для разных матричных захватов, чтобы сравнить результат. Каждый раз, когда мы дублируем длину строки и столбца. Я знаю, что это не имеет никакого отношения к тайнику. Может быть, это как-то связано с TLB?