作者yamamura (sadako)
看板java
標題[問題] thread會導致程式執行反而變慢嗎?
時間Wed Mar 31 22:31:22 2010
大家好
最近我寫了一個雙回圈
public static boolean issuperset(String a[], String b[]) {
int tmp = 0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
if (Integer.parseInt(a[i]) == Integer.parseInt(b[j])) {
tmp += 1;
}
}
}
if (tmp == b.length) {
return true;
} else {
return false;
}
}
總之就是在比較a集合有沒有包含b集合的東東
這段code也是卡在迴圈裡,因為彼此的運算獨立所以想寫成thread
最後只是想統計有幾個事件是[a集合有包含b集合],若超過某個數量則啟動其他事件
就先不管為什麼要特別寫這個脫褲子放屁的東西吧
我想問的問題是
我把這段改寫成thread之後執行發現比原本的執行時間還慢10多倍
輸出結果除了順序之外都是相同的,我應該可以確定程式邏輯沒有寫錯
不同於上例,這些thread額外共享一個類別變數,就是統計[a包含b事件]的總和用的
我把更改類別變數值的method寫成同步化
我用自己的4核心電腦跑,每一個核心都負載45%左右
若是用原本的方式,就會只有一個核心負載100%
當然結果就如上述是單核心的快,而且快很多
請問我有遺漏哪些重點呢?為什麼會這樣?
請各位高手解答,謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.49.56
→ tkcn:a, b 陣列分別多大? 原本執行時間多久? 開了幾個 thread? 03/31 22:36
→ yamamura:a較大,50-100個;b較小,1-10+個,會遞增 03/31 22:39
→ yamamura:原本20sec之後2min,每次約開1000個 03/31 22:40
→ tkcn:1000 個 thread? 這樣光 context switch 就花掉很多時間了@@ 03/31 22:47
→ tkcn:建立thread 也需要時間,你如果只開4個會比較看得到效果 03/31 22:49
→ yamamura:我寫 if (i % 4 == 3) 之後的thread[i].join,4個一輪 03/31 22:51
→ yamamura:但是沒有效果,等等跑看看時間差多少 03/31 22:53
→ choufeng:thread 不是開越多就越好 越快 03/31 22:54
→ yamamura:結果都是2分出頭,差不到5秒 03/31 23:00
→ tkcn:thread正確的用法根本不是你現在這樣 03/31 23:15
推 willieliao:thread本身有overhead,以妳四核心的電腦最快的方法應 04/01 13:56
→ nvidia:沒有人說使用thread會讓程式效率變快 04/08 17:22