c# – 在多维数组和单个数组之间存储数据的最有效方法是什么?
基本上我不知道如何存储3D数据结构以实现最快的访问速度,因为我不确定多维数组的内幕是什么.
注意:数组每次都是一个常量且已知的大小,每个元素都是16位. 选项一是拥有一个多维数组数据[16,16,16],只需通过数据[x,y,z]访问,选项二是具有单维数组数据[16 * 16 * 16]并通过数据[x(y * 16)(z * 16 * 16)]. 因为每个元素应该只有16位长,并且我怀疑多维数组会在内部以至少32位每个存储大量对其他数组的引用,这就是大量浪费的内存.但是,我担心它可能比每次运行第二个选项中指定的等式更快,速度是这个项目的关键. 那么,任何人都可以告诉我,与内存消耗的差异相比,速度差异有多大? 解决方法
C#将多维数组存储为单个内存块,因此它们编译成几乎相同的东西. (一个区别是有三组边界要检查).
即arr [x,z]几乎等于arr [x y * ny z * nz * ny],并且通常具有相似的性能特征. 然而,确切的性能将由内存访问模式以及它如何影响缓存一致性(至少对于大量数据)来控制.您可能会发现嵌套循环超过x,然后y然后z可能比以不同顺序执行循环更快或更慢,如果更好地将当前使用的数据保留在处理器缓存中. 这在很大程度上取决于确切的算法,因此不可能给出对所有算法都正确的答案. 与C或C相比任何速度降低的另一个原因是边界检查,在一维阵列情况下仍然需要这样做.但是,这些通常会(但不总是)自动删除. > https://blogs.msdn.microsoft.com/clrcodegeneration/2009/08/13/array-bounds-check-elimination-in-the-clr/ 同样,确切的算法将影响优化器是否能够删除边界检查. 您的行动方针应如下: >用arr [x,z]编写一个天真的算法版本.>如果它足够快你就可以停下来.>否则分析算法以检查它实际上是数组访问是哪个问题,分析内存访问模式等等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |