2009-10-09 27 views
1

我在我的視圖中使用foreach來遍歷我的強類型模型並顯示一個表。只有25行和7列,大約需要280毫秒。這似乎很慢。有什麼性能訣竅,我應該知道在視圖中使用循環?爲什麼我的foreach在ASP.NET MVC視圖中循環如此緩慢?

編輯:我的控制器從Azure表中獲取數據並使用ViewModel模式將其提供給視圖。我不知道這是否重要,但我的視圖是在VB中,我的模型是在C#中。所以,他們在單獨的項目。我會想出一個精簡的例子來發布,但我現在已經走出了門,今晚晚些時候將不得不去做這件事。我希望在人們週末回家之前趕上StackOverflow的人羣,所以我原來的帖子很快就沒有示例代碼。

編輯:我確認與提琴手,沒有懶加載發生。視圖渲染過程中沒有Fiddler活動。

編輯:如果我用Azure表中的數據提供視圖,則需要280毫秒。如果我使用與Azure表中的實際數據相似的假數據提供相同的視圖,則需要60毫秒。無論哪種情況,Controller都會填充ViewModel對象並將其傳遞給View。兩個實例都使用相同的ViewModel類。我不明白。

編輯:我想我想通了。如果我一開始就包含代碼,這對其他人來說可能是顯而易見的。這裏是我的ViewModel:

public class EmployeeChildrenViewModel 
{ 
    public Employee employee; 
    public IEnumerable<Child> children; 
} 

如果我通過上面的視圖模型以我看來,foreach需要280毫秒。如果我先用children.ToList()填充上面的ViewModel,那麼視圖只需要60毫秒。但是,經過進一步調查,我發現無論哪種情況,整個頁面加載時間都是相同的。我猜這是沒有關係,如果IEnumerable迭代在我的控制器或我的看法,因爲整體效果是相同的。我仍然不確定在children上迭代的結果是什麼,因爲我確信它不會觸及數據庫,正如Fiddler所確認的那樣。

+1

告訴我們你遍歷什麼,也許這是很重的東西,你沒有意識到這一點。你沒有給我們關於這個問題的信息。 – Karl 2009-10-09 21:09:10

+0

向我們展示一些代碼? – 2009-10-09 21:11:17

+0

@ eu-ge-ne&@Karl:對不起,我一開始應該這樣做。代碼現在發佈。 – royco 2009-10-10 17:28:59

回答

4

您是否正在使用Linq-to-SQL或其他默認加載的ORM?

我建議記錄所有數據庫調用(datacontext.Log =繼承自TextWriter的某些類),並檢查當您在View中迭代它們時是否延遲加載關聯。

編輯:看來下面的信息是不相關的這個問題,但我會離開這裏,因爲它可能是有用的人:

要去假設你正在使用LINQ到SQL在這裏(如果不是這種情況,我會編輯它):

當你的模型foo有一個關聯Bar(so foo.Bar)並且你沒有在datacontext中指定任何LoadOptions時,Bar會延遲加載(所以:調用時加載,就像你的視圖中可能發生的那樣),這意味着視圖本質上會進入數據庫。這發生在每一行。

這樣做以下:

DataLoadOptions options = new DataLoadOptions(); 
options.LoadWith<Foo>(f => f.Bar); 
context.LoadOptions = options; 

此外,爲了防止這種情況,請嘗試在using聲明包裹你的DataContext:

using(DataContext context = new DataContext()) 
{ 
} 

現在視圖就會產生一個異常時,一些關聯因爲DataContext現在將被丟棄並且不可用於數據庫操作。

+0

感謝您的回答。雖然我不使用LINQ到SQL,而且也沒有懶惰加載發生在我的觀點,你的帖子啓發我嘗試一些其他的事情,導致部分解釋。 – royco 2009-10-10 17:33:00

0

獲取.NET 4.0 beta和VS 2010測試版,並使用

Parallel.Foreach()

編輯:上面的回答應該是稍微諷刺。雖然這不是真正的解決方案,但是一旦您在VS 2010中獲得TPL的好處,您會明白我的意思。

實際上,你在循環什麼,你在循環中究竟做了什麼,它實際上取決於你的代碼結構,數據結構等等。需要更多的信息來獲得比上述更少的嘲諷答案。

+2

那麼,「狗慢」速度的兩倍還是比較慢。不是解決問題的辦法,而是解決症狀的辦法。 – JulianR 2009-10-09 21:09:13

+1

我不知道如果解決方案轉向並行計算。 – 2009-10-09 21:09:21

+0

@JulianR - 比快1000倍「狗慢」並不完善的一個普遍問題的複雜性,但我肯定會更喜歡使用1000×更快的版本的任何一天。 – Sev 2009-10-09 21:12:24

0

這是否真的只發生在視圖中?也許在迭代過程中執行數據庫加載會降低整個過程的速度。你有一些延遲加載實施?您應該在該過程中檢查數據庫活動。

+0

是,性能問題在一個視圖中只在一個循環。我使用提琴手檢查我查看有什麼數據庫活動,它不感謝您的文章,雖然 – royco 2009-10-10 03:24:27

+0

@Slack:。?。小提琴手將如何幫助您檢查DB活動 – UpTheCreek 2011-05-15 17:30:16

相關問題