對於單個Web請求,我們從外部系統中獲取1000行以上的數據行,我們需要在顯示數據之前將數據重新格式化爲更好的表示格式到網頁上的最終用戶。ASP.Net:緊密循環在表示層
當我們循環訪問ASPX頁面中的數據時,它正在創建一個消耗95%以上CPU的硬循環(或緊密循環?)。
我們如何避免CPU峯值,也有過程儘可能快地完成? TIA
對於單個Web請求,我們從外部系統中獲取1000行以上的數據行,我們需要在顯示數據之前將數據重新格式化爲更好的表示格式到網頁上的最終用戶。ASP.Net:緊密循環在表示層
當我們循環訪問ASPX頁面中的數據時,它正在創建一個消耗95%以上CPU的硬循環(或緊密循環?)。
我們如何避免CPU峯值,也有過程儘可能快地完成? TIA
你在這裏複製任何努力?後續請求中的相同數據是否相同?那麼也許你應該緩存結果?一些計算是否一樣,一遍又一遍?那麼也許你應該將計算結果與原始數據一起存儲。
底線:不這樣做在表示層緊密循環。它不屬於那裏。
它也傷害了你的可擴展性,BTW。您正在捆綁可能處理其他請求的工作線程,可能其他請求不是坐在緊密的CPU循環中。
Thx,我們目前正在研究使用緩存解決方案。好奇你爲什麼說在表示層中的緊密循環是不正確的,在我們的例子中,循環是將數據格式化爲更適合呈現的格式(或者如果需要,哪個層進行緊密循環?) TIA – Kishork 2009-06-16 08:04:30
它更多的是它在ASP.NET程序中不正確。在這個請求中,你正在綁定一個稀缺的工作線程,而這項工作幾乎肯定會在其他地方完成。緊張的CPU迴路在多大程度上受到請求細節的影響?請求是否改變處理1000行?請求是否改變了緊密循環中使用的算法?每行的處理是否獨立於其他行?如果是這樣,那麼你應該提前格式化行,然後返回預格式化的行。 – 2009-06-16 11:13:13
大廈約翰的#3,你真的需要1000行的數據?聽起來很多。用戶不會理解必須手動排序。考慮提供分頁或搜索功能,一次減少屏幕上顯示的數量。如果您已經將其編譯爲更少數量的記錄,則可以在數據庫中更高效地執行此操作。
除非你做了很多真的複雜的東西,我不知道你是如何注意你的CPU旋轉一個明顯的時間只勉強1000行。只要數據已經在內存中,您可以在很短的時間內在現代服務器上做一些認真的工作(聽起來就像是你的情況)。
在使用字典時,你是否正在重複迭代項目(即嵌套循環)?會更好嗎?仔細看看你在做什麼,並考慮每一行代碼實際運行多少次。
上週我工作的一些代碼必須評估約500,000個對象的一系列複雜安全規則。結束代碼運行約3.5分鐘 - 從數據庫加載2分鐘,處理10秒,以及1分20秒將結果寫入結果文件。一旦你記憶猶新,如果你確定你沒有多次循環數據,事情會非常快。
由於你的CPU是完全加載的,你可以做的唯一的事情就是優化算法(和代碼)做你的本地轉換 - 但考慮如果你的程序完全被cpu綁定,它可能正在做你想做的事情.... – 2009-06-16 03:07:44