如何在加载事件日志时降低CPU利用率?

时间:2011-10-05 10:04:51

标签: c# api event-log

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

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;
        }
    }
}

4 个答案:

答案 0 :(得分:0)

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

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

修改 通过将执行委托给单独的线程,可以减少平均CPU负载,但总执行时间会增加。

答案 1 :(得分:0)

在您继续更改代码之前,最好先执行一些性能测试,看看瓶颈在哪里。

几个月前我问过的一个问题是关于可以用来衡量应用程序性能的方法,以及在执行此操作时可以考虑的一些注意事项:

Function profiling woes - Visual Studio 2010 Ultimate

答案 2 :(得分:0)

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

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

您想问的是“如何减少此算法所需的时间”/“是否有更高效的算法”,因为您使用的任何算法都将以100%运行直到完成。

如果你解释一下你在这里尝试做什么会有所帮助,也许还有更好的方法。

查看代码,我认为最大的开销是GetEventKey方法,向我们展示代码可能会有所帮助。

  1. GUI线程中100%的CPU使用率通常是一件坏事,因为GUI可能变得无法使用,因为GUI线程必须等到消耗CPU的方法在处理用户交互之前完成。

答案 3 :(得分:-1)

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