2009-08-04 65 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界面智能,這將優化最反正常見的情況就好了。

所以在這種方法中可能沒有太多的意義。