阅读以下文章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 []?
感谢
答案 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
但整体要慢得多。(对于突然的额外空间感到抱歉)