簡體   English   中英

改善我的應用程序的性能?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM