2009-08-04 64 views
4

在一个项目中我的工作,真的有巨大的集合(1M-1B族元素),事物修改藏品居多。实现自己的LINQ和IEnumerable的<T>

这是一个实时应用程序,因此性能是最重要的。

对于一些操作,如反向,二分查找(可能吗?)等将遭受比其他人一样选择更多的,等

是否可行实现自己的IEnumerable有可能的MoveNext,MovePrev等,并自己实现的LINQ扩展,利用这些?

如果这是要发生的事,它会发生在项目结束。因为我们需要先让它工作,然后让它更快。

总而言之,这不应该工作太多吧?

+1

对不起,但您不清楚您打算如何通过滚动自己的序列界面来实现性能增益。这个计划完全是什么?你担心什么代码并试图替换? – mquander 2009-08-04 21:40:41

+0

我想补充一点,如果你以数百万的数量对你的集合中的元素进行编号,你可能不会立即将所有这些全部存储在内存中,对吗?因此,一种天真的检索方法将成为你花费的成本,通过磁盘或网络访问成本或其他方式。如果您担心性能,无论如何,您将不得不提出更复杂的抽象,而不仅仅是简单的枚举。 – mquander 2009-08-04 21:43:06

+0

这里包含所有细节非常广泛,但是作为一个简单的例子,例如Reverse功能,或者BinarySearch为WhereSorted或其他东西的集合。 – 2009-08-04 21:43:35

回答

9

这是非常绝对有可能创建自己的实现的Enumerable可能特殊情况的一些情况。你基本上想要检测自己的集合类型(或者可能只是集合,如List<T>),并在适用的情况下使用更高效的实现。

我有一个sample project我用它来演示“执行LINQ到在一个小时的对象”,你可能喜欢看的例子。这不是一个完整的实现,特别是它的不如高于真正的LINQ to Objects - 但你仍然会发现它很有趣。

或者,你可能会发现,i4o (Indexed LINQ)确实需要开箱一切 - 或者,你会过得更好促进该不是从头开始。值得检查。

只要记住,在这一天结束时,LINQ基本上是一个不错的设计加上语法糖。例如,C#编译器不知道什么特别关于System.Linq.Enumerable

2

如果你真的想要表现,你可以做很多事情。请记住,以下的选择:

var result = from element in collection 
      where element.Id == id 
      select element; 

编译如下:

var result = collection.Where(element => element.Id == id); 

如果您创建的collection类型下面的方法,那么你可以利用的事实,主要操作是ID平等成员并以优化的方式处理请求。重要的是正确识别集合中对性能至关重要的操作,并选择正确的算法(即复杂性)来执行它们。

public IEnumerable<TElement> Where(Expression<Func<TElement, bool>> selector) 
{ 
    // detect equality of the Id member and return some special value 
} 
2

考虑System.Linq.Enumerable.Reverse() - 此方法在返回第一个结果之前完全枚举IEnumerable。

如果你的查询是myCollection.Reverse()。拿(10),你的集合有数十亿物品,列举数十亿物品以获得10个物品是一个可怕的想法。

如果您在自己的类型上提供了Reverse方法,则可以提供更好的实现,它只是简单地向后循环(通过可能的索引)。

这个的关键是提供你自己的类型来控制实现。您无法使用适用于所有IEnumerable<T>的实现,因为这些实现不会充分利用自定义集合类型的功能。

1

是否可行实现自己 IEnumerable的有可能的MoveNext, MovePrev等,并拥有该采取的 这些优势实现LINQ 扩展?

IEnumerable(或者更恰当,IEnumerator)没有MovePrev。你可以定义一个接口:

public interface IReversable<T> : IEnumerable<T> 
{ 
    IEnumerator<T> GetReverseEnumerator(); 
} 

这可以通过任何支持高效反向枚举的容器来实现。

然后,您可以编写一个重载的Reverse(扩展方法)来处理这个新的接口,以及实现接口的集合类等等。然后,您必须使用这些集合类而不是标准类List<T>

但(我没有反光方便检查),它可能是内置Reverse足够做事情的快捷方式,如果它可以从收集的IList界面智能,这将优化最反正常见的情况就好了。

所以在这种方法中可能没有太多的意义。