• 2

多核心CPU與單執行緒程式實測...

多核心在單執行緒程式中,只能用到其中一個核心來運算,這是大家都有的共識吧?

今天突發奇想,來個實際驗証。

設備:
CPU:E6550
Ram:DDR-2 800 1G

首先,將能關閉的背景程式全都關掉,讓CPU的使用率歸零。


接下來,寫一個單執行緒程式,1+1連續加1億次,程式碼如下。

Dim i As Double
Dim douTemp As Double
For i = 0 To 100000000
douTemp = douTemp + 1
Next i

來看一下CPU使用率吧...

上圖可見,雖然第一個核心使用率不高,但還是有在運作喔...

再來,測試另一個程式,字串處理,例子是將"test"這段文字一直疊加至字串變數中
Dim i As Double
Dim strTemp As String

For i = 0 To 100000000
strTemp = strTemp & "test"
Next i

一樣,來看一下CPU使用率...

上圖可見,字串處理時,兩個核心都操滿兇的。

很有趣吧?明明是單執行緒程式,卻能同時使用兩個CPU核心耶...,會寫程式的朋友可以試試看喔。
2008-07-01 15:16 發佈
'剛剛用C++寫了一下...發現不同的事情....
是CPU接近48%沒錯(Q9300)~所以是動用雙核
可是到執行程序裡看...原程式還是25%(單核)~
剩下的是由系統啟動的一叫SYSTEM的程序吃掉的...也就是說~很可能不是原程式
我的猜測是...會不會是用來分配記憶體區域的執行緒啊?
有請板上高手指導...
小弟最近做的就是這一塊~還蠻想知道原因的
minisis wrote:
'剛剛用C++寫了一...(恕刪)


我的猜測跟你差不多耶,我在想,是不是執行時,OS分配運算的工作給核心1、再將搬移資料至記憶體的工作交給核心2去做?
看[處理程序]那一頁的CPU使用率才準.

那邊才會分別列出各程式的CPU使用率

syntech wrote:
看[處理程序]那一頁...(恕刪)


在處理程序那看到的的確是單一程式,只是很好奇另一個核心到底是在忙啥。
就和二樓說的一樣,
如果你的程式在四核只有25%以下,不會高過26%,
在雙核只有50%以下,不會高過51%
那就是一個單執行緒(single thread)程式.
真正的多執行緒(multithread)程式會塞滿cpu使用率,
不管幾核心應該會到9x % 以上(正常是執行的時間有差).

另外,其他核心在忙什麼也不關你的程式的問題.
因為os有很多要忙.

你也許應該看看vb.net 是怎麼寫多緒程式
之前就用Delphi寫過多執行緒程式了,是可以塞滿CPU使用率沒錯,現在只是想了解單執行緖程式時,為何另一個核心也在使用,而且使用率還不低(不關我程式的問題,那在忙啥= =+,問題就在這啊,背景程式能關掉的都關掉了。)

待會來試試單核心與雙核心執行同一支程式,看哪支程式比較早跑完好了。
song321c wrote:
之前就用Delphi...(恕刪)


你忘了你呼叫的 API 內部可能就有多緒支援了。

有些情況下,例如你的第二支程式,跑你的程式迴圈也許系統以 CPU1 去跑,但 string API 可能丟給 CPU2 在跑.

不是單一 Process 就真的不會跑 CPU2 ,還要看你 compiler 怎麼編譯你的程式。
第二支程式的寫法每個 loop裡面會
1. New string Object
2. free string Object
當然OS有很多事情要做

應該要用string Buffer之類的class
會快非常多
剛剛測試的結果,將字串那支程式改為10萬次,
E-6550(2.33G)執行到完成需21秒
P4-2.8G(無HT)執行到完成需1分19秒

有差,還差滿多的=_=+
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?