使用c#在堆栈或堆上更快的数学向量?

时间:2012-09-19 04:27:04

标签: c# heap-memory

我的理解是CPU与CPU缓存(L1等)一起执行其数学运算,并且如果操作所需的值不在缓存中,则需要在计算之前从RAM获取页面可以执行。因此,似乎有理由认为,托管堆RAM是一个比使用操作系统在大量非托管堆栈RAM中找到的任何旧漏洞更好的地方。我这样说是因为我假设托管内存比非托管内存更紧密,因此数学运算的向量(x,y,z)更有可能存储在加载到缓存中的相同页面中;而作为堆栈结构的向量可能是页面分开的。在这种情况下,任何人都可以解释基于类而不是基于结构的向量类的优缺点吗?

2 个答案:

答案 0 :(得分:2)

CPU缓存完全由CPU管理。最近访问的内存由相对较大的块缓存(即访问位置周围的128个字节)。

操作系统管理物理内存的分页。如果你的应用程序经常遇到这个过程(即你的数据大小比物理RAM大),那么担心外部CPU缓存线命中和未命中的其他问题。

从这个角度来看,堆栈和堆之间基本没有区别。唯一有意义的区别是下一条数据与最近使用过的数据的接近程度。

在大多数情况下,数学类(矢量/矩阵/点)存储在连续的内存块中,用于托管和本机实现。因此,缓存行为可能具有可比性,除非有人明确地做了一些奇怪的分配,以使单个元素在内存中相隔很远。

摘要:如果性能受到严重关注,请务必对代码进行分析并保持数据紧凑。

尝试并测量跨阵列的不同迭代次序。即如果每次迭代时迭代越过缓存行 - 在大多数数组访问时必须重新填充高速缓存时,在2d数组中逐行或按行首先显示可以测量到足够大的数据集的差异...

答案 1 :(得分:0)

堆栈更快here是一个更详细地覆盖它的网站。