看板 java 關於我們 聯絡資訊
大家好 最近我寫了一個雙回圈 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