線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1175
推到 Plurk!
推到 Facebook!

多线程更有效率吗?

 
coolsoft
一般會員


發表:19
回覆:10
積分:5
註冊:2003-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-21 11:33:37 IP:218.18.xxx.xxx 未訂閱
各位老大: 我在一个项目中有大量的数据要处理 对一个数组进行一定的逻辑运算 一开始我用单一的过程来处理,大体是这样的 for i:=0 to 7 for j:=0 to 100 { 处理过程 } 耗时大约为40ms 我想再次优化所以我把处理过程分为8 份建立8个线程来处理 每个线程负责处理一部分数据,结果耗时为50ms左右,反而更慢; 这是为什么呢???? 难道多线程更没效率?????
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-21 16:26:49 IP:210.244.xxx.xxx 未訂閱
我不敢回答你多執行序是不是可以加快效能,因為我不確定 這得要靠其它的大大了,但是可以提醒你一下迴圈成立記得 要加break跳出去,可以省下你一點時間喔.... 發表人 - jimmy_wei 於 2004/10/21 16:37:21
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-21 18:35:00 IP:211.20.xxx.xxx 未訂閱
引言: 各位老大: 我在一个项目中有大量的数据要处理 对一个数组进行一定的逻辑运算 一开始我用单一的过程来处理,大体是这样的 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-29 16:19:09 IP:218.17.xxx.xxx 未訂閱
多谢,大有收获!!!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-30 00:10:34 IP:61.64.xxx.xxx 未訂閱
引言:
引言: 各位老大: 我在一个项目中有大量的数据要处理 对一个数组进行一定的逻辑运算 一开始我用单一的过程来处理,大体是这样的 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:臨時想到就貼上來了,言詞不順或有謬誤,敬請見諒! _______________________________________ 深藍的魚,祝您好運..........連連
是啊~不過也有例外 只要你的 CPU 有兩個以上,那 MultiThread 將會有效能上的進步 所以不見得完全是針對 IO 才有用 但是這時要注意運算上的先後使否會互相影響
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-01 13:34:42 IP:219.134.xxx.xxx 未訂閱
OS是否有支持多线成的能力,这个也是该要注意的。。。。 藏私の禁止
daybreak
一般會員


發表:14
回覆:15
積分:5
註冊:2003-11-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-11 06:38:13 IP:222.134.xxx.xxx 未訂閱
的确收获不小!谢谢各位老大!
系統時間:2024-07-02 12:25:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!