Warum läuft dieser parallele Algorithmus langsamer als sein sequentielles Gegenstück?

Sequentiell:

void do(List<D> d, final List<C> c) {
for (D datum : d)
    getChampoid(datum, c).tally(datum);

Parallel:

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();
        }

Ich bin ratlos, weil sie für mich genauso aussehen, als ob sie genau dasselbe tun. Die parallele Version sollte nur schneller sein, aber es ist eine Größenordnung langsamer. Irgendwelche Gedanken?

Zu Ihrer Information, sowohl d als auch c sind riesige Listen mit irgendwo zwischen Tausenden und Hunderttausenden von Gegenständen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage