繁体   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