作者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
1F:→ tkcn:a, b 阵列分别多大? 原本执行时间多久? 开了几个 thread? 03/31 22:36
2F:→ yamamura:a较大,50-100个;b较小,1-10+个,会递增 03/31 22:39
3F:→ yamamura:原本20sec之後2min,每次约开1000个 03/31 22:40
4F:→ tkcn:1000 个 thread? 这样光 context switch 就花掉很多时间了@@ 03/31 22:47
5F:→ tkcn:建立thread 也需要时间,你如果只开4个会比较看得到效果 03/31 22:49
6F:→ yamamura:我写 if (i % 4 == 3) 之後的thread[i].join,4个一轮 03/31 22:51
7F:→ yamamura:但是没有效果,等等跑看看时间差多少 03/31 22:53
8F:→ choufeng:thread 不是开越多就越好 越快 03/31 22:54
9F:→ yamamura:结果都是2分出头,差不到5秒 03/31 23:00
10F:→ tkcn:thread正确的用法根本不是你现在这样 03/31 23:15
11F:推 willieliao:thread本身有overhead,以你四核心的电脑最快的方法应 04/01 13:56
12F:→ nvidia:没有人说使用thread会让程式效率变快 04/08 17:22