【发布时间】:2020-04-21 20:00:13
【问题描述】:
我查看了 System.Linq 命名空间的源代码code,我注意到 OrderedQueryable 类的 ToArray 方法创建了三个数组,但我们可以使用一个数组进行排序。为什么要这样做??
【问题讨论】:
-
似乎是微软的问题
标签: c# iterator enumerable
我查看了 System.Linq 命名空间的源代码code,我注意到 OrderedQueryable 类的 ToArray 方法创建了三个数组,但我们可以使用一个数组进行排序。为什么要这样做??
【问题讨论】:
标签: c# iterator enumerable
这是因为分配不会花费太多时间,它是时间上的固定长度操作,与数组的大小无关。
整个 .NET 框架假设我们只处理合理的大小,超过 1 MB 的数组相当少见,内存分配(在短时间内)是一个很好的折衷方案。
此外,每个 CPU 都内置了非常快速的内存移动操作,.NET Framework 不提供对这些功能的直接访问,但内部确实可以访问它,它们使用指针并将内存直接传输到内存,没有托管代码。
对于排序操作,他们通过索引映射选择方式。 int 是 CPU 中性能最高的数据类型。 (虽然不是最小的可能)。如果您有一个结构数组,这尤其可以节省内存。想象一个由 1000 个元素组成的数组,具有 300 字节长的结构。每次交换项目都需要移动 900 字节!!! (300 到临时,300 从起点到目的地,300 从临时到起点)。使用索引 Map 需要移动 12 个字节,并且可能在 CPU 寄存器中完成。可能快1000倍。 所以拥有两个数组,加上一个索引,是最小化内存移动操作的最佳解决方案。
你是对的,实现不是支持最小的内存使用,而是更好的性能。
【讨论】: