2010-02-01 25 views
3

我一直在努力在win32,c,C++一段時間。我在Visual Studio上編碼。大多數情況下,我看到系統空閒進程使用更多的CPU利用率。有沒有辦法爲我的程序分配更多的處理器週期以更快地運行它?我知道I/O可能存在限制,在這些情況下,這個問題沒有任何意義。 或 我誤解了任務管理器號碼嗎?我很困惑,請幫助我。 我想在程序本身做什麼,順便說一句,如果答案是特定於Windows,我會很高興。分配更多處理器週期到我的程序

在此先感謝 〜卡爾文

回答

4

如果你的程序是唯一需要做的事情(不要等待IO),它的線程將總是被分配給一個處理器內核。但是,如果您有多核處理器和單線程程序,則任務管理器中顯示的進程的CPU使用率將始終受限於100/Ncores。例如,如果你有一臺四核機器,你的進程將是25%(使用一個內核),空閒進程在75%左右。您只能通過將您的任務分成可由獨立線程處理的塊的方式來增加CPU的能力,這些線程將在空閒內核上運行。

+0

謝謝你把我從雜草中拔出來...... – rplusg

2

在沒有其他進程需要的空閒進程唯一的「運行」。如果你想使用更多的CPU週期,然後使用它們。

1

如果你的程序空閒,它什麼也不做,即沒有任何事情可以做得更快。所以CPU可能不是你的情況下的瓶頸。 你可能正在等待來自磁盤或網絡的數據?

如果您的處理器具有多個內核,並且您的程序只使用一個內核,那麼使您的程序可以運行多線程。

1

在多任務/多線程操作系統中,處理器的時間在線程之間分配。
如果你想要一個特定的線程來獲得更大的時間塊,你可以使用SetThreadPriority函數來設置它的優先級,但不是明智的做法。
只有特殊軟件(應該)弄亂那些設置。

是很常見的窗口應用,具有低CPU使用率百分比(這是我們在任務管理器中看到)
因爲大部分的時間,他們只是等待消息。

1

使用線程:

  • 抽象掉所有的I/O等待。
  • 將工作分配給所有內核。

此外,從主線程中刪除所有睡眠等待狀態。

將所有I/O推遲到一個線程,以便等待狀態被限制在其中。將實際的計算保留在前臺線程中,並使用同步機制使I/O從線程在通信時等待主線程。研究「設置親和力」功能,以便在內核之間分配它們,併爲所有I/O保留一個單獨的線程。如果您的CPU是多核的,並且您的問題可以並行化,請創建儘可能多的線程, 。請注意不要在主線程中等待--USLEEP(1)不會將您發送到背景1微秒,而是「不低於...」,這可能表示1毫秒到100毫秒之間的任何內容,但是幾乎沒有那麼少,並且從來沒有接近1微秒的時間。

相關問題