最近遇到一個關於Linq的問題,
.where(provider).FirstOrDefault();和.FirstOrDefault(provider);的性能比較
關於這個主要有以下三種說法,但這方面的資料比較少,我找到的就下面着幾個地方。
第一種說法:.where(provider).FirstOrDefault()比較快,
支持這個觀點的資料:http://stackoverflow.com/questions/8663897/why-is-linq-wherepredicate-first-faster-than-firstpredicate
第二種說法:.FirstOrDefault(provider)比較快
感覺FirstOrDefault更加直接有效。
第三種說法:差不多一樣快,這種說法也比較多,因為從linq的lazy來說及兩種方法核心都是用List.GetEnumerator的來說應該是一樣的
支持這個觀點的資料:http://prashantvc.wordpress.com/2013/03/07/where-firstordefault-vs-firstordefault/
別人說的做為參考,還是自己測試一下
但通過測試的結果貌似是驗證第一種說法。
最后在msdn上找到了我認為的答案
http://msdn.microsoft.com/en-us/library/bb882641.aspx
結果是,這兩種性能完全看data的provider
有的情況直接(Immediate)執行快,有的情況延時的(Deferred) 快
比如說data是連接數據庫,或者『wellcoded』的遠端數據源,Deferred streaming肯定更快
但是如果是完全備置的數據而且索引良好訪問順暢,那直接(Immediate)執行會快點(主要是少了一層yeild)。
這個具體可以通過上面的msdn網站查找其類型。
ps:這個地方的應用不局限於這兩種方法,Linq的其它方法也都有着區別,在應用的時候查看一下該方法的類型應該是有幫助的。