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

За последние несколько дней я немного узнал о параллелизме и наткнулся наэтот пример.

Я положил его из стороны в сторону с последовательным циклом for следующим образом:

<code>private static void NoParallelTest()
{
    int[] nums = Enumerable.Range(0, 1000000).ToArray();
    long total = 0;
    var watch = Stopwatch.StartNew();
    for (int i = 0; i < nums.Length; i++)
    {
        total += nums[i];
    }
    Console.WriteLine("NoParallel");
    Console.WriteLine(watch.ElapsedMilliseconds);
    Console.WriteLine("The total is {0}", total);
}
</code>

Я был удивлен, увидев, что метод NoParallel завершил работу намного быстрее, чем приведенный на сайте параллельный пример.

У меня есть компьютер i5.

Я действительно думал, что параллельный метод закончится быстрее.

Есть ли разумное объяснение этому? Может я что то не так понял?

 Oded02 мая 2012 г., 15:56
Предполагая, что параллельная версия работала на нескольких ядрах, она может просто показать вам, сколько может иметь служебная синхронизация потоков ... особенно в тривиальном фрагменте кода.
 chrisaycock02 мая 2012 г., 15:53
Можете ли вы подтвердить, что параллельная версия действительно работала на нескольких ядрах? И что происходит, когда вы увеличиваете количество итераций (большеRange)?
 user17780002 мая 2012 г., 16:24
Перефразируя Марка Твена;"There are lies, damn lies, statistics and benchmarks ..."

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

это потому, что цикл выполняет очень простую, очень быструю операцию.

В случае непараллельной версии это все, что она делает. Но параллельная версия должна вызывать делегата. Вызов делегата происходит довольно быстро, и обычно вам не нужно беспокоиться о том, как часто вы это делаете. Но в этом крайнем случае это то, что имеет значение. Я легко могу представить, что вызов делегата будет, скажем, в десять раз медленнее (или даже больше, я не знаю, каково точное соотношение), чем добавление числа из массива.

Решение Вопроса

потому что время, затрачиваемое на выполнение операций на каждой итерации в вашем примере, очень мало, и при создании и управлении несколькими потоками возникают довольно значительные накладные расходы.

Параллельное программирование увеличивает эффективность только тогда, когда каждая итерация является достаточно дорогой с точки зрения процессорного времени.

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