为什么 OrderedQueryable class 的 ToArray 方法分配了很多?

Why does the ToArray method of the OrderedQueryable class much allocated?

我查看了 System.Linq 命名空间的来源 code,我注意到 OrderedQueryable class 的 ToArray 方法创建了三个数组,但我们可以使用一个数组进行排序。为什么要这样做??

这是因为分配不会花费太多时间,它是时间上的固定长度操作,与数组的大小无关。

整体 .NET Framework 假设我们只处理合理的大小,超过 1 MB 的数组很少见,内存分配 - 短时间 - 是一个很好的折衷方案。

此外,每个 CPU 中都内置了非常快速的内存移动操作,.NET Framework 不提供对这些函数的直接访问,但内部确实可以访问它,它们利用指针和直接将内存传输到内存,无需托管代码。

对于排序操作,他们通过索引映射选择方式。 int 是 cpu 中性能最高的数据类型。 (虽然不是最小的)。如果您有一个结构数组,这尤其可以节省内存。想象一个包含 1000 个元素的数组,其结构为 300 字节长。每次交换项目都需要移动 900 字节!!! (300 到临时,300 从起点到目的地,300 从临时到起点)。对于索引映射,这是要移动的 12 个字节,并且可能在 CPU 个寄存器中完成。可能快1000倍。 所以拥有两个数组,加上一个索引,是最小化内存移动操作的最佳解决方案。

你是对的,实现不支持最小的内存使用,而是更好的性能。