为啥 OrderedQueryable 类的 ToArray 方法分配很多? [关闭]

Posted

技术标签:

【中文标题】为啥 OrderedQueryable 类的 ToArray 方法分配很多? [关闭]【英文标题】:Why does the ToArray method of the OrderedQueryable class much allocated? [closed]为什么 OrderedQueryable 类的 ToArray 方法分配很多? [关闭] 【发布时间】:2020-04-21 20:00:13 【问题描述】:

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

【问题讨论】:

似乎是微软的问题 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于为啥 OrderedQueryable 类的 ToArray 方法分配很多? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到 [Error] no matching function for call to 'car::car()'

闭包:为啥它们如此有用?

为啥 `to.` 是一个有效的域名?

为啥数字类型只有一个`to_string()`?

为啥没有“to”属性时存在节被拒绝

为啥 render_to_response 不能正常工作