顺序:
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 都是巨大的列表,其中包含数千到数十万个项目。