我想優化一個併發集合,試圖最小化讀取的鎖爭用。第一遍使用的是鏈接列表,這允許我只鎖定寫入,而許多同時讀取可以繼續暢通。這使用一個自定義的IEnumerator
到產量下一個鏈接值。一旦我開始比較了集合迭代純List<T>
我發現我實現一半左右的速度(對於from x in c select x
上的1 * M *項目的集合,我得到24MS爲List<T>
和49ms我的集合)。尋找IEnumerable/IEnumerator更快的實現
所以我想我會使用ReaderWriteLockSlim
並犧牲讀取的一點爭論,所以我可以使用List<T>
作爲我的內部存儲。由於我必須在迭代開始時捕獲讀鎖,並在完成時釋放讀鎖,因此我首先對我的IEnumerable
,foreach進行了內部List<T>
的良率模式。現在我只得到66ms。
我偷偷看看List實際做了什麼,它使用T[]
的內部存儲和自定義IEnumerator
,它向前移動索引並返回當前索引值。現在,手動使用T[]
作爲存儲意味着更多的維護工作,但是,我正在追逐微秒。
然而,即使模仿IEnumerator
移動索引的陣列,我能做的最好的是大約~38ms。那麼,究竟是什麼給了它的祕訣,或者迭代器的更快實現呢?
更新:原來我的主要速度罪魁禍首是運行調試編譯,而List<T>
顯然是一個發佈編譯。在發佈中,我的實現仍然比List<T>
慢,儘管單聲道現在更快。
我從朋友那裏得到的另外一個建議是BCL更快,因爲它位於GAC中,因此可以通過系統預編譯。將不得不在GAC中進行測試來測試該理論。
@Arne:我添加了一個你可能想嘗試的編輯。事實上,如果你不需要檢測併發修改,你應該能夠*擊敗'List'的性能:) –
2009-11-18 07:36:34