一个8长的数组可以放入64字节的高速缓存行吗?

时间:2014-12-14 08:32:26

标签: c# caching

因此,英特尔的I7处理器内存以64字节写入和读取。 因此,如果我想填充缓存行,我可以使用16个long(每个4个字节)。

如果一个16个long的数组,是否适合整个缓存行,或者是否有一些数组开销?

我担心的是,如果一个数组有任何开销,并且我使用16个long,那么总的大小(以字节为单位)将溢出超过64个。

那么它更像new long[63],还是new long[62]等?

1 个答案:

答案 0 :(得分:0)

在C#中,long数据类型是System.Int64的别名,是8个字节,而不是4. int类型,即System.Int32,是4字节。因此,64个字节的long值是8个元素,而不是16个。

托管阵列的存储实际上是连续的,因此理论上是的,long[8]恰好适合64字节的高速缓存行。但请注意,只有在64的倍数的地址上正确对齐才能这样做。由于您无法控制分配位置,这将很难做到。

因此,即使没有数组中的开销,也无法保证long的单个8元素数组实际上恰好适合64字节的高速缓存行。

当然,长于此的数组将具有对齐的子范围,因此可以完全缓存。但是,对于您可能拥有的任何数据类型而言,这都是正确的。坦率地说,要担心的不是数据的大小或数组的长度,而是访问模式。有关如何以有助于确保有效使用缓存的方式访问数据的建议,请参阅“数据位置”。