【发布时间】:2013-10-14 22:54:30
【问题描述】:
顺序:
void do(List<D> d, final List<C> c) {
for (D datum : d)
getChampoid(datum, c).tally(datum);
平行:
static final int procs = Runtime.getRuntime().availableProcessors();
static final ExecutorService pool = Executors.newFixedThreadPool(procs);
void do(List<D> d, final List<C> c) {
List<Future> futures = new ArrayList<>();
for (final D datum : d)
futures.add(pool.submit(new Runnable() {
@Override
public void run() {
getChampoid(datum, c).tally(datum);
}
}));
for (Future f : futures)
try {
f.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
我很困惑,因为在我看来,它们看起来完全一样,并行版本应该更快,但速度要慢一个数量级。有什么想法吗?
仅供参考,d 和 c 都是包含数千到数十万项的巨大列表。
【问题讨论】:
-
你怎么知道它跑得慢?
-
在第一个代码 sn-p 中,您将列表
d传递给tally(),而在第二个代码中,您将列表项datum传递。这是一个版本中的错字吗? -
无法说明原因,因为您没有提供足够的信息。
-
List<D> d包含多少项?顺序和并行版本执行多长时间?
标签: java concurrency parallel-processing