Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果索引之间的距离更远,按索引访问数组元素是否需要更长的时间?_C#_.net_Arrays - Fatal编程技术网

C# 如果索引之间的距离更远,按索引访问数组元素是否需要更长的时间?

C# 如果索引之间的距离更远,按索引访问数组元素是否需要更长的时间?,c#,.net,arrays,C#,.net,Arrays,是这样的吗 Console.WriteLine(arr[0]); Console.WriteLine(arr[1]); 取短于 Console.WriteLine(arr[0]); Console.WriteLine(arr[1823]); 出于硬件层面的原因?访问数组元素或多或少是O1。这是因为,当您使用myIntArray[500]时,您实际上是在执行类似于:memory\u location+500*sizeofint的操作 现在,从技术上讲,较大的数字相乘需要更长的时间,但这种差异非

是这样的吗

Console.WriteLine(arr[0]);
Console.WriteLine(arr[1]);
取短于

Console.WriteLine(arr[0]);
Console.WriteLine(arr[1823]);

出于硬件层面的原因?

访问数组元素或多或少是O1。这是因为,当您使用myIntArray[500]时,您实际上是在执行类似于:memory\u location+500*sizeofint的操作


现在,从技术上讲,较大的数字相乘需要更长的时间,但这种差异非常小,因此我们可以称之为O1,因此您的示例中的差异可能永远感觉不到。

在一般情况下不会。但缓存有细微差别。在大多数情况下是的。假设数组包含整数,第一个元素不在任何CPU缓存中,应该从主内存中获取。它不会单独获取,它只有4个字节,仅获取这4个字节是没有效率的。取而代之的是,在CPU中获取并缓存更大的连续内存块。现在,当你们在下一行中访问第二个元素时——很有可能它现在在CPU缓存中,主内存不需要麻烦。从缓存中提取要比从内存中提取快得多。如果你下次访问1823元素,它不太可能在缓存中,需要再次访问内存。我不同意EVK。内存就是内存,如果它是主内存或缓存,则不应该有任何区别。微处理器有扇区,只要内存扇区有效,就应该有所不同。如今,微处理器可以使用64位扇区和地址访问内存位置,并且可以在一次提取中获得位置。任何高达64位的偏移量也可以添加到一条微处理器指令中。如果你处理的是大于64位的大内存,这将花费更长的时间,甚至比Evk说的还要复杂。例如,假设您的algo读取整个数组,但只是以随机顺序读取。如果整个阵列都适合缓存,那么主内存的读取量仍将与按顺序读取阵列时相同,因此所用的时间也将相同。你的问题不能单独回答,这太简单了。主内存和缓存之间的交互是驱动实际性能的因素。这是我从搜索中发现的。你发现了什么?你的回答,还是我的评论?我的回答,通过几个问题。恐怕你认为你发现的是不正确的。