如何提高CPU使用率

P陳
各位好:
用VB.NET 寫了一個程式,資料讀進來了,沒有對SSD硬碟作IO。
但程序的CPU使用率只有15%左右,系統的總使用許率不到 30%。

覺得跑起來有點慢,CPU 還有很多能量未發揮,大眼瞪小眼的
請問一下有無方法可以如何提高這個程式的CPU使用率



最有價值解答

誰是誰
如果允許,就是靠平行運算搾 CPU
asakous
應該說明一下,資料讀進來你的程式要作什麼?才容易理解。不然標準的來說會用 multi thread 來處理。不然也可進 message queue 。用 worker 處理。
P陳
謝謝 誰是誰、asakous 二位的回應
Sorry 出差了幾天,剛才才回來

1.是從資料庫取出資料
2.放入 DataTable 中
3.在 Datatable 中一筆筆依序運算
4.因為下一筆的資料要等前一筆算完再算,所以不適合用平行運算
5.所有資料運算完後再回寫入資料庫

6.因為看到CPU才10來% 而已,磁碟只一點點在動,想問看看有沒有指令可以提高 CPU 的利用率,不然就只能乾秏而已
asakous
你的問題有口能不會程式端問題。更有可能是db端問題。
有兩種加快的方式。
1:用 db procedure 處理。可省去網路來來回回跟transaction commit 時間。
2:不要1筆筆 commit。要嘛1次寫完 commit。要嘛 數仟或數百筆 commit 1 次。
P陳
asakous 您好感謝回應:

目前是一次全部讀入資料表到記憶體中
----------------------------
一連串的計算 要處理連續計算的值 ,所以不能用平行運算
等全部算完了...... (這裏的CPU 約只用了18%左右) 要算很久
------------------------
再一次寫出
P陳
如果能該該程序的CPU使用率提高到 60%,就可以較快算完了。
asakous
set 程式 priority ? 能貼一下您的算法流程跟簡單資料嗎?也許有其它算的方式。
P陳
程式大約如下

假設有一萬筆資料
要算20筆的 移動平圴 算標準差 算MACD 算 RSi 等等......
dt1
for Recii=0 to totrec-20
取出20資料放入DT2 ,從 dt1 的 recii 到 recii+19 共20筆
ma20=dt2.compute("avg(value1)","")
std20=dt2.compute("sted(value1)","")
call macd(20,dt2)
call rsi(20,dt2)
...
...
next


asakous
是 每1次 loop 跑 1-20 下次 21-40 。還是 1-20 ,下次2-21
P陳

1~20
2~21
3~22
4~23

想到了
1~20 的
ma
std
macd
rsi
1~20 可以分給平行作業 都作完了再 接
2~21 平行作業 都作完了再 再接
3~22 平行作業 都作完了再 再接
....
....

但至於效率如何? 要試試看了。這只是興趣
目前有正事要辦,能用在這上頭的時間較少了

還有不一定是 20筆算一次,有可能是 5筆 或60筆 不一定
P陳
這是計算另外有整理的部份 由 50萬筆左右,整理成1萬筆 CPU 也是20%以下,磁碟是 0% 網路也是0%
看起來要想辦法切割成可以 平行處理的模式了

經您的提點,目前有想到了程式分割的邏輯了,還是再試一下
P陳
另您提到的 set 程式 priority 有較明確的指令或參數 嗎?
P陳
看起來平行作業是唯一解了,雖然有 4個CPU 但還是只有一個在跑,其餘的在空等。

挖礦 提高 CPU 使用效率 方法
P陳
asakous
1~20 的計算結果會影響 2~21 的計算結果?

set 程式 priority -->工作管理員->詊細資料->設優先順序
P陳
有些計算是 前一日的 1/3 + 本日的 2/3 ,前一日是前前一日的 1/3 + 前日的 2/3 所以會有影響
但每種計算式原則可以平行處理,這要再研究一下

set 程式 priority -->工作管理員->詊細資料->設優先順序 <--- 這只能在某個 核心 之下提高,頂多只能將該核心佔滿而已,4核心的沒有跑平處處理還是會在25% 以下。

asakous
我印象中。1個程式能跑 multi threads 。但不可以跑 multi cores。你要所有的 cpu 跑滿。你還是用 queue 的方式。但還得考慮每個 job 是否有先後關系。沒有的話最容易。有的話就得再想想
回到頂部