2012-06-19 56 views
3

我有一個很大的二進制文件(約700 Mb),我加載到TMemoryStream。之後,我使用TMemoryStream.Read()進行讀取並進行一些簡單的計算,但應用程序永遠不會佔用20%以上的CPU。我的電腦有i7處理器。 有沒有機會增加CPU使用並加速讀取過程而不使用線程?爲什麼Firemonkey應用程序使用不超過20%的CPU?

+4

讀取過程幾乎肯定受到硬盤驅動器速度的限制。如果你的計算非常簡單,我還想知道內存帶寬是否會限制速度? – Harriv

+2

爲了加速程序,可能會做很多事情。但是除了您稱之爲TMemoryStream.Read的事實外,不可能提供任何有意義的建議。 –

+3

一個核心上100%的CPU使用率= 25%的CPU使用率。一個核心i7有4個真正的,然後「超線程」使它看起來像操作系統的8個核心。這是8個核心。我很高興你能獲得超過14%的使用率。如果你使用8個線程,每個線程完全受CPU限制,你將在任務管理器中獲得「100%」。就我個人而言,我發現一個100%cpu綁定的單線程應該由windows報告爲「100%cpu綁定」。您的代碼在單個線程中已經最大限度地低效了。 –

回答

2

加上Shannon的回答,在具有多個內核的i7處理器上,一個線程只會使用一個內核。一個線程無法在多個處理器內核上運行。因此,如果你想利用多個內核,你需要創建多個線程來處理各種任務。創建一個線程並不一定像在該線程中說的那樣簡單,關於多線程還有很多需要了解的內容。例如,您的應用程序具有一個主要的GUI線程,那麼一個線程可能專門用於執行一些長時間的計算,另一個線程可能正在將標題更新爲實時數據等等。

Windows會自動決定將哪個內核分配給一個線程,並且通常會將其分配給相當數量的內核。所以,如果你有8個處理器內核和16個線程,每個內核會得到2個線程(假設),並且由於每個內核自己分開發送tick,所以不止一個線程可以同時運行(相反到單個核心,它在每個線程之間劃分每個「滴答」)。

所以要回答你的問題,如果你有5個線程同時執行一些大的事情,那麼你會看到100%的處理器使用率。

+2

除非如上所述,瓶頸位於其他位置(HDD,RAM) – Kromster

+1

但是,當單線程使用單個內核的100%時,Windows會報告任務管理器中的「25%CPU」。這正是傑瑞想要在這裏解釋的。 –

相關問題