来自“处理器缓存效果库”和再现结果的示例

时间:2015-08-17 22:41:26

标签: java caching cpu

阅读以下文章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)
}

但是我的问题,解决了创建不同大小的数组。它在文中说: &#34;我们将尝试不同的阵列大小&#34;在上面的所有示例中,它使用以下数组:

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

我只是对

感到困惑
int[] arr = new int[64 * 1024 * 1024];
int steps = 64 * 1024 * 1024;

我是否需要更改arr []和步骤或仅更改arr []?

感谢

1 个答案:

答案 0 :(得分: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);    
        }

我得到的结果比例子慢得多,但确实显示出类似的趋势。

以kbyte为单位的大小= 1.0,示例3 - 持续时间为75.672

...

以kbyte为单位的大小= 32.0,示例3 - 持续时间为61.096 以kbyte为单位的大小= 64.0,示例3 - 持续时间为154.679

//在32kb到64kb之间跳转

另一个跳跃在2MB到8MB之间

以kbyte为单位的大小= 2048.0,示例3 - 持续时间为219.073

以千字节为单位的大小= 4096.0,例3 - 持续时间为390.967

以千字节为单位的大小= 8192.0,例3 - 持续时间为487.781

但整体要慢得多。(对于突然的额外空间感到抱歉)