Почему этот параллельный алгоритм работает медленнее, чем его последовательный аналог?

Последовательная:

void do(List d, final List 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, final List c) {
    List 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 - это огромные списки с тысячами и сотнями тысяч элементов.

Ответы на вопрос(2)

Ваш ответ на вопрос