加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在多维数组和单个数组之间存储数据的最有效方法是什么?

发布时间:2020-12-15 23:32:47 所属栏目:百科 来源:网络整理
导读:基本上我不知道如何存储3D数据结构以实现最快的访问速度,因为我不确定多维数组的内幕是什么. 注意:数组每次都是一个常量且已知的大小,每个元素都是16位. 选项一是拥有一个多维数组数据[16,16,16],只需通过数据[x,y,z]访问,选项二是具有单维数组数据[16 * 16
基本上我不知道如何存储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]编写一个天真的算法版本.>如果它足够快你就可以停下来.>否则分析算法以检查它实际上是数组访问是哪个问题,分析内存访问模式等等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读