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

5

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

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

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

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

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

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

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

Можете ли вы подтвердить, что параллельная версия действительно работала на нескольких ядрах? И что происходит, когда вы увеличиваете количество итераций (большеRange)? chrisaycock
Перефразируя Марка Твена;"There are lies, damn lies, statistics and benchmarks ..." user177800
Предполагая, что параллельная версия работала на нескольких ядрах, она может просто показать вам, сколько может иметь служебная синхронизация потоков ... особенно в тривиальном фрагменте кода. Oded

Ваш Ответ

2   ответа
2

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

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

10

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

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

Похожие вопросы