[英]Is there an updated version of “Improving .NET Application Performance and Scalability”?
[英]Improving The Performance Of My Application?
我有一個包含任務列表的數據庫表。 我有一個程序,可以計算指定時間段內每分鍾運行的任務數。
我有一個查詢可在指定的時間段內獲取所有結果,而另一個linq查詢在循環中可獲取每隔一分鍾的時間間隔內的所有結果。
一切都很好,但是現在我很難提高代碼的性能。
for(int i=0;i<oneMinuteIntervals;i++){
var resultsThisMinute =
from fullResult //this contains all of the tasks in the whole period
where //task is running during this one minute interval
foreach(var result in resultsThisMinute){
//Does stuff
}
}
即使resultThisMinute為空,在foreach循環上也要花費大約33毫秒。 我嘗試添加一個if(resultsThisMinute.Count()== 0),但是它花費了for循環的時間。 在很多情況下,給定的分鍾內有0個任務,因此我希望有一種更快的方法來檢查這一點。
如果有,請發表,我真的很感激!
問題是您要為每個循環迭代完全迭代fullResult。 不需要這個。 相反,您可以模擬一個時鍾,並查看隨着時間的推移哪些任務處於活動狀態。
假設您的任務有一個StartTime,一個EndTime和一個唯一的ID ...(未經測試)
Queue<Task> starts = new Queue(fullResult.OrderBy(task => task.StartTime));
Queue<Task> ends = new Queue(fullResult.OrderBy(task => task.EndTime));
Dictionary<int, Task> activeTasks = new Dictionary<int, Task>();
for(int i=0;i<oneMinuteIntervals;i++)
{
DateTime current = ComputeDateTime(i);
// may be needed
// current = current.AddMinutes(1);
while(starts.Any() && starts.Peek().StartTime < current)
{
Task startingTask = starts.Dequeue();
activeTasks[startingTask.Id] = startingTask;
}
foreach(Task result in activeTasks.Values)
{
//Does stuff
}
while(ends.Any() && ends.Peek().EndTime < current)
{
Task endingTask = ends.Dequeue();
activeTasks[endingTask.Id] = null;
}
}
另外-確保在//Does Stuff
部分中沒有發生數據訪問。 那會大大降低您的速度。
對於數學上的傾向,我將原始的執行時間描述為t * n +?,這是簡單的嵌套循環,其中t是分鍾數,n是fullResult中的行數,? 是找到活動任務后枚舉活動任務的執行時間。
我的代碼是2 *(n log n)+ 2 * n +? ,這是兩種排序和兩個完整的迭代。
除非在foreach循環之前調用.ToList()
或類似方法,否則直到開始枚舉循環中的結果之前,您實際上並沒有進行數據庫查找。 這很可能是33毫秒的來源,如果這是原因,則既無法避免也不必擔心:對於數據庫查詢而言這非常快。
我假設您的循環中有一些內容需要在每次迭代之間延遲一分鍾,在這種情況下,無需避免每次迭代的查找開銷。
[編輯]
只是注意到您正在從另一個查詢中提取結果。 您需要確保fullResults
變量包含ToList()
或ToArray()
的結果,以避免每次從數據庫中提取結果時都命中數據庫。
您的查詢正在對數據庫進行oneMinuteIntervals調用。 您可能能夠按分鍾分組,並添加時間作為關鍵,以便將其簡化為單個數據庫調用。 所以你會有一個像
Dictionary<Datetime, fullResult>
並用單個數據庫調用填充字典。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.