为啥 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 方法分配很多? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章