多线程更有效率吗? |
|
coolsoft
一般會員 ![]() ![]() 發表:19 回覆:10 積分:5 註冊:2003-07-15 發送簡訊給我 |
|
jimmy_wei
高階會員 ![]() ![]() ![]() ![]() 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
|
Chance36
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 各位老大: 我在一个项目中有大量的数据要处理 对一个数组进行一定的逻辑运算 一开始我用单一的过程来处理,大体是这样的 for i:=0 to 7 for j:=0 to 100 { 处理过程 } 耗时大约为40ms 我想再次优化所以我把处理过程分为8 份建立8个线程来处理 每个线程负责处理一部分数据,结果耗时为50ms左右,反而更慢; 这是为什么呢???? 难道多线程更没效率?????coolsoft 你好 以你所提供的資訊來看,運算的目標為陣列,也就是說所有的運算都在記憶中進行,未牽扯到其他的Device 的IO,完全都是操CPU,由此可知,運算的過程中CPU的使用量幾乎是保持100%,表示CPU正全力在處理你的運算程序。 在這個狀況下,把運算過程切割為數個執行緒,CPU除了要全力處理運算過程,還要分心處理執行緒的分派以及分時作業,反而多了這個工作的使用時間,以至於你所看到的,用8個執行緒戶而費時更多。 至於什麼時候使用執行緒才會產生效率的增加呢?前面提到Device的IO,就是關鍵,如磁碟、網路、USB、COM....的存取作業,當這些作業發生時,CPU會處於等待的狀態,等這些存取作業完成後才繼續後面的程序,因此我們可以在[工作管理員]中看到CPU的使用量忽高忽低的,這就是使用執行緒的最佳時機,因為在device的IO作業時CPU是處於等待的狀態,若還有其執行緒時,這等待的時間,作業系統就可以分配給其他的執行緒處理運算,意思就是使用另外的執行來填補這些Device IO所產生的等待時間。這就是為什麼你所作的測試無法提高效率的原因,因為它沒有等待時間的空隙,供給其他執行緒運行的空間,反而多了系統分派工作的負擔。 至於要使用幾個執行緒才是最好的效能呢?這恐怕沒有標準答案喔!這要看上述的等待時間與真正運算的時間比率(即有多少比例可供補空隙)、作業系統分時的適時性(某個執行緒正在等待時,系統剛好分配到另一執行緒執行運算的工作才算及時,否則分配到的執行緒也是處理於等待中就於浪費了)、有多少其他應用程式執行(即有沒有其他程式來搶CPU的時間)及系統的配備而定,一般空檔比例在60%到80%的程式約使用4~6個執行會有個不錯的執行效率(切記,這不是個絕對值而是參考值,你應該自行測試過才能決定)。 ps:臨時想到就貼上來了,言詞不順或有謬誤,敬請見諒! _______________________________________ 深藍的魚,祝您好運..........連連 |
coolsoft
一般會員 ![]() ![]() 發表:19 回覆:10 積分:5 註冊:2003-07-15 發送簡訊給我 |
|
syntax
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言:是啊~不過也有例外 只要你的 CPU 有兩個以上,那 MultiThread 將會有效能上的進步 所以不見得完全是針對 IO 才有用 但是這時要注意運算上的先後使否會互相影響引言: 各位老大: 我在一个项目中有大量的数据要处理 对一个数组进行一定的逻辑运算 一开始我用单一的过程来处理,大体是这样的 for i:=0 to 7 for j:=0 to 100 { 处理过程 } 耗时大约为40ms 我想再次优化所以我把处理过程分为8 份建立8个线程来处理 每个线程负责处理一部分数据,结果耗时为50ms左右,反而更慢; 这是为什么呢???? 难道多线程更没效率?????coolsoft 你好 以你所提供的資訊來看,運算的目標為陣列,也就是說所有的運算都在記憶中進行,未牽扯到其他的Device 的IO,完全都是操CPU,由此可知,運算的過程中CPU的使用量幾乎是保持100%,表示CPU正全力在處理你的運算程序。 在這個狀況下,把運算過程切割為數個執行緒,CPU除了要全力處理運算過程,還要分心處理執行緒的分派以及分時作業,反而多了這個工作的使用時間,以至於你所看到的,用8個執行緒戶而費時更多。 至於什麼時候使用執行緒才會產生效率的增加呢?前面提到Device的IO,就是關鍵,如磁碟、網路、USB、COM....的存取作業,當這些作業發生時,CPU會處於等待的狀態,等這些存取作業完成後才繼續後面的程序,因此我們可以在[工作管理員]中看到CPU的使用量忽高忽低的,這就是使用執行緒的最佳時機,因為在device的IO作業時CPU是處於等待的狀態,若還有其執行緒時,這等待的時間,作業系統就可以分配給其他的執行緒處理運算,意思就是使用另外的執行來填補這些Device IO所產生的等待時間。這就是為什麼你所作的測試無法提高效率的原因,因為它沒有等待時間的空隙,供給其他執行緒運行的空間,反而多了系統分派工作的負擔。 至於要使用幾個執行緒才是最好的效能呢?這恐怕沒有標準答案喔!這要看上述的等待時間與真正運算的時間比率(即有多少比例可供補空隙)、作業系統分時的適時性(某個執行緒正在等待時,系統剛好分配到另一執行緒執行運算的工作才算及時,否則分配到的執行緒也是處理於等待中就於浪費了)、有多少其他應用程式執行(即有沒有其他程式來搶CPU的時間)及系統的配備而定,一般空檔比例在60%到80%的程式約使用4~6個執行會有個不錯的執行效率(切記,這不是個絕對值而是參考值,你應該自行測試過才能決定)。 ps:臨時想到就貼上來了,言詞不順或有謬誤,敬請見諒! _______________________________________ 深藍的魚,祝您好運..........連連 |
japhenchen
高階會員 ![]() ![]() ![]() ![]() 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
daybreak
一般會員 ![]() ![]() 發表:14 回覆:15 積分:5 註冊:2003-11-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |