2011-10-05 36 views
1

我有一个程序,加载系统的事件日志到Hastable使用。问题是它利用了100%的CPU。使用API​​调用降低使用率的最佳解决方案是什么?如何在加载事件日志时降低CPU利用率?

Hashtable currentLog = (Hashtable)_logs[l.Log]; 

foreach (EventLogEntry e in l.Entries) 
{  
    if (_lastRun <= e.TimeWritten.ToUniversalTime()) 
    {         
     if (_verboseOutput) 
     { 
      Logger.TraceWrite(String.Format(
            "Source={0}, EventId={1}, Date/Time={2}, Message={3}", 
            e.Source, 
            e.EventID, 
            e.TimeWritten, 
            e.Message)); 
     } 

     string key = GetEventKey(e); 
     if (currentLog[key] == null) 
     { 
      currentLog[key] = e; 
     } 
    } 
} 
+0

当你说“100%CPU”时,你的意思是“100%** core **”吗?无论哪种情况,为什么这是一个问题?你真的想说这需要很长时间吗?如果是这样,多少时间? –

+0

100%的CPU。当一个事件使用100%的CPU时它健康吗? – Rawanee

+0

对于**完全相同的**处理量,“100%”与“50%”使用率是“健康的”,因为这意味着您将以两倍的速度完成。我不太清楚的是,除非使用单核CPU,否则如何从上述代码中获得100%的CPU使用率。在我的四核上,CPU使用率只有25%(即100%的核心使用),以上代码的简化版本。也许'Logger.TraceWrite'传递数据到后台线程(你可以告诉我们)? –

回答

-1

高CPU使用率可能是由于迭代器必须遍历整个事件日志来检查是否有新的可用。尝试切换出foreach,并使用for来代替。您还可以尝试在Visual Studio中使用性能分析工具来查看哪些行是CPU热点。

+0

有没有办法通过使用API​​调用来降低CPU利用率?由于for不会根据CPU利用率给出注意到的更改。 – Rawanee

0

您可以在一个单独的thread低优先级(Thread.Priority)加载日志:

Thread thread = new Thread(loadLogsMethod); 
thread.Priority = ThreadPriority.BelowNormal; 
thread.Start(); 

编辑: 通过委派执行到您减少平均CPU负载,但总执行时间单独的线程将增加。

+1

这不会占用更少的CPU周期,它只会将执行推迟到具有更高优先级的线程。它可能会提高系统的稳定性,但它不能解决问题。 – Polynomial

+0

@Polynomial:我相信这样(线程优先)CPU *负载*将会减少(但总执行时间会增加)。 – sll

+0

不,总体CPU负载将是相同的。它只允许其他更高优先级的线程跳入并在处理器上执行而不是线程。 – Polynomial

0

看来,在你继续并改变你的代码之前,进行一些性能测试以查明瓶颈的位置是明智的。

我提出的问题,几个月前你可以用它来衡量你的应用程序的性能的方法,以及一些,你可以做,而这样做的考虑的会谈:

Function profiling woes - Visual Studio 2010 Ultimate

0

通常,100%CPU使用没有问题。所有这一切意味着处理器在操作期间运行时间最长。这是一件好事。为什么浪费时间迫使CPU停止工作?操作系统很可能是先发制人的操作系统(因为你已经将c#标记为可能是Windows),所以多项式对稳定性的评论是不正确的,操作系统将切换任务而不管负载如何。

如果您将CPU使用率降低到50%,那么处理过程将花费两倍的时间。

你想问的是“我怎样才能减少这个算法花费的时间”/“是否有更高效的算法”,因为你使用的任何算法都会以100%运行,直到它完成。

如果你在这里解释你想要做的事情,这将有所帮助,也许有更好的方法来做到这一点。看看代码,我认为最大的开销是在GetEventKey方法,告诉我们代码可能会有所帮助。在GUI线程

  1. 100%的CPU使用率通常是作为GUI线程必须等待,直到多数民众赞成消耗CPU的方法处理用户交互之前完成的GUI将无法使用一件坏事。