2011-01-20 37 views
3

我有以下的LINQ聲明,我發現它沒有按照我想要的那樣快速運行。是否有其他變化速度更快,還是有另一種更快的方法?當將結果提取到列表時,LINQ執行速度會慢嗎?

var products = session.Products.Where(x => x.Supplier.Address.State == "HI").ToList(); 
+1

爲什麼你認爲它會給表演帶來麻煩嗎? (我不是說它沒有,但是你的文章沒有給出任何關於實際基準與非LINQ操作相等的跡象)。 – 2011-01-20 13:58:28

+1

我沒有看到任何問題。你有性能評論的來源嗎? – fearofawhackplanet 2011-01-20 13:58:43

回答

5

你沒有說的是,這是在一個特定LINQ提供商的博客文章。讓我們把它放在上下文中:

現在查詢它:

using(var session=new Session()){ 
    var products = session.Products.Where(x => x.Supplier.Address.State == "HI") 
            .ToList(); 
} 

...和它的作品:)。這就是ObjectDatabase世界中所謂的「Deep Graph」查詢,通常會給性能帶來麻煩。說實話,我還沒有把這個查詢綁定在多個記錄上 - 但是從我讀過的這個對於Mongo來說這是正常的,並且它支持的很好。

這並不是ToList進行通話的「通常你帶來麻煩的性能」 - 它是你正在做的一個對象數據庫「深圖查詢」的事實。是的,你將所有的結果都記錄到記憶中,但這是商店的本質,這是令人擔憂的。

2

爲什麼這種說法 「通常法術 麻煩性能」

事實並非如此。

2

爲什麼你認爲這種相當常見的LINQ表達式對性能有困難?這種說法應該以某種形式的表現分析爲後盾。

雖然LINQ表達式方法本身相當簡單,但我會查看Supplier.Address.State鏈的實現。這些屬性是否需要大量的工作來評估?

更新:考慮到這是對一個MongoDB的倉庫,並且要查詢每個產品,尋找供應商的地址的狀態值的事實查詢,讓你去3級「深」的對象圖形。在提供者中沒有任何智能的情況下,它強制數據庫加載每個「級別」。實際上,對於每個Product,除了產品對象本身之外,您實際上正在加載供應商和地址。

0

你可以做這樣的:

var products = 
    (from product in session.Products 
    where product.Supplier.State == "HI" 
    select product).ToList(); 

但只爲readabiity。我不認爲這個表現是一個問題。

0

session.Products中有多少項目? 這個表達式被調用了多少次?

我們在我們的項目中廣泛使用Linq,但有一次在關鍵代碼中,我們被迫使用標準的foreach操作符來重寫相似的表達式。我們的名單包含約10-20項,但它被稱爲50000-70000次。我們將時間成本從約0.3秒降低到0.001秒。

在一般使用情況下(例如,在網頁上顯示產品),您的樣品不會影響性能。

0

使用ToList()將立即執行您的語句,並且如果您希望沒有ToList()執行的查詢將被推遲到您引用'products'變量爲止。但從業績預期來看,他們將是一樣的。如果你有一些性能問題嘗試並行查詢

var products = session.Products.AsParallel().Where(x => x.Supplier.Address.State == "HI").ToList(); 

但是現在你還不如以前有你在不同的順序列表,因此,如果順序很重要,你可以使用AsOrdered()

var products = session.Products.AsParallel().AsOrdered().Where(x => x.Supplier.Address.State == "HI").ToList();