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

本文关键字:CPU 利用率 日志 加载 事件 | 更新日期: 2023-09-27 18:10:24

我有一个程序,加载系统的事件日志到一个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;
        }
    }
}

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

在您继续更改代码之前,执行一些性能测试以查看瓶颈所在似乎是明智的。

几个月前我问了一个问题,讨论了可以用来衡量应用程序性能的方法,以及在这样做时可以考虑的一些问题:

函数剖析问题- Visual Studio 2010 Ultimate

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

如果你将CPU使用减少到50%,那么处理将花费两倍的时间。

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

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

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

    在GUI线程中使用100%的CPU通常是一件坏事,因为GUI线程必须等到正在消耗CPU的方法完成后才能处理用户交互,因此GUI可能变得不可用。

您可以在低优先级(thread . priority)的单独线程中加载日志:

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

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

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