[問題] thread會導致程式執行反而變慢嗎?

看板java作者 (sadako)時間15年前 (2010/03/31 22:31), 編輯推噓1(1011)
留言12則, 5人參與, 最新討論串1/4 (看更多)
大家好 最近我寫了一個雙回圈 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

03/31 22:36, , 1F
a, b 陣列分別多大? 原本執行時間多久? 開了幾個 thread?
03/31 22:36, 1F

03/31 22:39, , 2F
a較大,50-100個;b較小,1-10+個,會遞增
03/31 22:39, 2F

03/31 22:40, , 3F
原本20sec之後2min,每次約開1000個
03/31 22:40, 3F

03/31 22:47, , 4F
1000 個 thread? 這樣光 context switch 就花掉很多時間了@@
03/31 22:47, 4F

03/31 22:49, , 5F
建立thread 也需要時間,你如果只開4個會比較看得到效果
03/31 22:49, 5F

03/31 22:51, , 6F
我寫 if (i % 4 == 3) 之後的thread[i].join,4個一輪
03/31 22:51, 6F

03/31 22:53, , 7F
但是沒有效果,等等跑看看時間差多少
03/31 22:53, 7F

03/31 22:54, , 8F
thread 不是開越多就越好 越快
03/31 22:54, 8F

03/31 23:00, , 9F
結果都是2分出頭,差不到5秒
03/31 23:00, 9F

03/31 23:15, , 10F
thread正確的用法根本不是你現在這樣
03/31 23:15, 10F

04/01 13:56, , 11F
thread本身有overhead,以妳四核心的電腦最快的方法應
04/01 13:56, 11F

04/08 17:22, , 12F
沒有人說使用thread會讓程式效率變快
04/08 17:22, 12F
文章代碼(AID): #1BirozVp (java)
文章代碼(AID): #1BirozVp (java)