【问题标题】:What does IPartition do in .NET Core?IPartition 在 .NET Core 中的作用是什么?
【发布时间】:2017-01-07 01:20:35
【问题描述】:

我查看了 .NET Core 源代码,以了解当集合实现 IList 时,对 IEnumerable.Last() (LINQ) 的调用是否得到优化,经过一些快速基准测试后我怀疑是这种情况。 It turns out that yes, the input is specifically checked for IList,然而,甚至在此之前,检查输入是否实现IPartitionIPartition is defined here,但我完全不明白它应该做什么。

IPartition 的目的是什么,它怎么可能比IList 的通常恒定时间索引更快(或者如果不是,为什么IPartition 的输入检查早于@987654331 @)?

【问题讨论】:

  • 它似乎被Take 之类的方法用来创建数据的子集。请记住,在使用 IQueryable 等时,可以在数据完全加载之前调用许多 linq 方法。检查IPartition 可能会进行一些偷偷摸摸的优化。

标签: c# .net linq .net-core


【解决方案1】:

当集合支持索引时,它是对作用于索引(Take/Skip 等)的可枚举方法的优化。 IIListProvider 相关。

有几个implementations。在文件中搜索IPartition

关于这个有issues

IPartition 允许将更高级别的操作委托给底层集合。例如,new int[10].Skip(1) 很慢,因为所有数据都经过两个IEnumerable<int>。使用IPartition 实现,这实际上变成了for (int i = 1 ... 9) emit(list[i]);。所以它没有使用中间枚举器,而是调用列表索引器,它比枚举速度稍快。

这是一个非常粗略的描述。我鼓励您查看 Github 讨论和代码。

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多