2010-11-08 249 views
6

我有一個多線程的C#應用​​程序,其中核心邏輯位於Timer.Elapsed事件處理程序中。事件處理程序包含最多執行n * n = 5 * 5 = 25 times的2個循環,其中包括2個forC#應用程序 - 減少CPU使用率

該應用程序在我的電腦上運行良好。我運行VS 2010 Profiler針對應用程序和CPU使用率平均值爲20%

該公司測試儀說,他的電腦上這個跳轉到他的電腦上介於50%100%。這對他造成了性能問題。

  • 有什麼我可以做的補救措施呢?
  • 高CPU使用率究竟意味着什麼?
  • 這會影響他的電腦嗎?
  • 是否可以告訴應用程序只使用X的數量 CPU?

任何幫助,將不勝感激。

+0

循環執行的次數僅意味着上下文中執行的內容。如果執行25次昂貴的操作可能是一個大問題。如果你總結到25就沒有關係。 – rerun 2010-11-08 09:31:05

+0

你的定時器多久開一次?而且,在再次啓動計時器之前,您是否等待完成操作?或者,您是否繼續開始循環啓動循環,無論前一個循環是否完成? – 2010-11-08 14:37:16

+0

定時器每秒執行一次。在定時器事件處理程序中,我停止了第一行代碼中的定時器,並在最後一行代碼中重新啓動它。實際上,這隻會在事件之間產生1秒的延遲。在啓動和停止計時器之間的代碼,在一個ConcurrentDictionary的內存中進行一些計算,這可以大大增加。計算非常簡單,但基於大量的數據。在這個事件處理程序中沒有與UI發生交互,因此我沒有使用DispatcherTimer和BackgroundWorker。 ConcurrentDictionary由各種事件更新。 – c0D3l0g1c 2010-11-09 05:59:06

回答

3

你在疑惑和猜測模式。忘記CPU百分比。專業人員所做的是找出爲什麼該計劃的花費時間以及是否有必要。

你可以做的只是在長循環中運行該代碼並對其進行採樣。 I use this method. 堆棧樣本將優先落在調用樹的重型分支中。 有機會,你可以砍掉一些重型分支,並獲得不錯的加速。

+0

看到我上面的評論。 – c0D3l0g1c 2010-11-09 06:16:53

+0

@ c0D3l0g1c:以下是CPU使用情況。 CPU始終在執行。當它不執行實際代碼時,它正在執行空閒進程。使用率只是實際代碼花費的時間的短期平均值。當你的進程等待I/O時,它沒有運行,所以顯示爲較低的使用率。如果它嘎吱嘎吱,它會更高。它與代碼的效率無關。我所說的是要做的事情。基本上,通過找到你可以修剪掉的調用樹的重要分支來領先。 – 2010-11-09 12:40:38

+0

謝謝,有道理!您之前發佈的文章很有用。 – c0D3l0g1c 2010-11-10 04:22:39

6
  • 運行計時器事件不經常
  • 上做的一個工作線程工作(所以UI至少響應)
  • 少做工作,在定時器(或更有效地做到這一點)
  • 得到更多的CPU

我猜你確實是第三個項目符號,但我們無法回答,不知道代碼在做什麼;但(沒有任何背景隨機建議):

  • 看任何集合訪問,看看是否有是一本字典,哈希集的地方,或類似
  • 檢查,如果你正在做大量的IO(特別是一種DB),它可以減少
  • 檢查,如果你是通過Invoke會大量線程開關(或UI的等價物)
+0

見上面的評論。 – c0D3l0g1c 2010-11-09 06:02:40

1

只需在for循環中添加Thread.Sleep(1);即可。這穩定了CPU使用率並限制了以最大速度使用CPU。

0

可能是您的應用程序運行多個線程。我有同樣的問題,運行多個線程,並在每個線程中有不斷更新,使應用程序的使用率從50%到100%。

在調查了這個問題之後,我剛纔介紹了線程連續循環中的延遲(Thread(100))。這使應用程序使用率回到1%到3%。