2011-10-05 61 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將無法使用一件壞事。