![]() |
1
3
clr支持两种不同的数组类型: 向量 和 数组 . 矢量是一维的,是基于零的-因此访问一个元素只是一个例子:
并执行非常简单的边界检查:
数组(用clr术语)可以是多维的,并且有不同的下限——因此访问它们需要付出更多的努力。例如,对于二维数组:
以及边界检查
基本上,它是为常见的一维零基情况而优化的,但是对于真正使事情变得更好的情况,它支持多维数组。 |
![]() |
2
0
我的最佳猜测是,它是与内存访问。 内存不是三维数组,而是一维数组。因此,您的3D阵列必须转换为1d阵列的数据点,放置在内存中。这意味着,当您访问一维数组中的数据时,它只需获取数组中第一个数据点的内存位置,并添加偏移量即可获得您请求的数据点的位置。 但是对于3D阵列,它必须获取第一个点的位置,将您提供的3个偏移量相乘,以获得一维内存偏移量,然后访问内存中的该点。这会增加额外的开销。它不多8毫秒(甚至200毫秒),超过100万件物品是非常小的。我假设for each使差异更加明显,因为它现在必须计算出数组每个维度的偏移量,并将偏移量向下转换为一维内存位置。如果.NET多维数组是作为数组数组实现的,这意味着for each在处理数组的每个维度的枚举器时必须做很多工作。 [免责声明:这不是事实,只是一个基于记忆知识和如何访问的理论猜测。] (不要太担心这个问题,只要对数据有意义就使用3D阵列。访问时间的差别是如此之小,你最好让代码易于维护和可读,而不是仅仅为了几毫秒的性能就把三维数据压缩到一维数组中。) |
![]() |
Emopusta · 从后端到前端的图像路径不工作 2 年前 |
![]() |
Asdrubal Hernandez · Linq查询特定数组索引出错 2 年前 |
![]() |
Niyazi Babayev · 如何在表达式中动态应用表达式? 2 年前 |
|
Dansih · .Net核心自定义身份验证方案 3 年前 |
![]() |
lolorekkk · 面板插入。NET WinForm 3 年前 |