2015-08-17 1 views
-2

Читает следующую статью http://igoro.com/archive/gallery-of-processor-cache-effects/ Что я думаю, это довольно интересно.примеры из «Галерея эффектов кеш-памяти процессора» и результаты воспроизведения

Я стараюсь следовать примерам и воспроизводить результаты из каждого примера. В примере 3 они говорят о фрагменте кода и его результате, который я нахожу не совсем понятным. Они упоминают, что для каждого размера массива производительность, которую я действительно понимаю. Но, конечно, часть кода не совсем полная.

Вот код

int steps = 64 * 1024 * 1024; // Arbitrary number of steps 
int lengthMod = arr.Length - 1; 
for (int i = 0; i < steps; i++) 
{ 
    arr[(i * 16) & lengthMod]++; // (x & lengthMod) is equal to (x % arr.Length) 
} 

Но мой вопрос, решает вокруг создания этого массива разного размера. Он говорит, что в тексте: «Мы будем экспериментировать с различными размерами массива» В то время как во всех примерах выше этого использует следующий массив:

int[] arr = new int[64 * 1024 * 1024]; 

Я просто путаться с

int[] arr = new int[64 * 1024 * 1024]; 
int steps = 64 * 1024 * 1024; 

Would Мне нужно изменить arr [] и шаги или просто arr []?

благодаря

+0

Я уверен, что у них есть. Теперь притворитесь, что они здесь читают ваш пост прямо сейчас ... как вы думаете, что они ответят на сообщение, в котором нет контекста о том, что ваша проблема, и нет прямого запроса? Они собираются перейти к следующему человеку, которому нужна помощь. И выберите язык. Большинство ответов будут немного отличаться в зависимости от языка. –

+0

Что значит «делать» в этом контексте? –

+1

Не добавляйте теги только потому, что синтаксис подобен! – Olaf

ответ

0

Так после попытки у меня есть следующие:

 for(int size = 1; size < 40000; size = size * 2){ 
      //int = 4byte 
      //1k = 1024byte or 
      //1000/4 = 256 int as base 
      int[] arr = new int[size * 256]; 
      int steps = 64 * 1024 * 1024 ; 
      long lengthMod = arr.length - 1; 
      long startTime = System.nanoTime(); 
      for (int i = 0; i < steps; i++) 
      { 
       arr[(int) ((i * 16) & lengthMod)]++; // (x & lengthMod) is equal to (x % arr.Length) 

      } 
      long estimatedTime = System.nanoTime() - startTime; 
      double sizekb = ((size * 256) *4)/1024.0; 
      System.out.println("Size in byte = "+ sizekb + ", example 3 -- Duration is " + estimatedTime/1000000.d);  
     } 

Результаты я получаю гораздо медленнее, чем, например, но это показывает аналогичную тенденцию.

Размер в кбайт = 1.0, пример 3 - Продолжительность 75,672

....

Размер в кбайт = 32.0, пример 3 - Продолжительность 61,096 Размер в кбайт = 64,0, например, 3 - Продолжительность 154,679

// скачок между 32kb к 64kb

и еще один скачок между 2MB к 8MB

Si, ге в кбайт = 2048.0, например, 3 - Продолжительность 219,073

Размер в кбайт = 4096,0, пример 3 - Продолжительность 390,967

Размер в кбайт = 8192,0, пример 3 - Продолжительность 487,781

Но в целом намного медленнее. (Извините за внезапные лишние пробелы)