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



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



Я положил его рядом с последовательным циклом 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 PC.



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

Есть ли этому разумное объяснение? Может Быть, Я ... что-то не так понял?
684   3  

3 ответов:

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

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

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

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

Вы не сравниваете яблоки с апельсинами.

Пример, на который вы ссылаетесь, не столько о параллелизме или параллелизме, сколько ооб отключении состояния от совместного использования различными потоками . Работа , которую он делает, - это соломенный человек, чтобы просто показать, что что-то делается.

Итак, то, что вы сравниваете, похоже на сравнение автомобиля F1 с топовым Драгстером. Каждый преуспевает в движении быстро , но быстро относительно контекст , который в этом и большинстве случаев является узкоспециализированным. Не можете конкурировать на другие узкоспециализированные компетенции.

Уроки, которые нужно выучить

  • одновременно != быстрее
  • плохо продуманные ориентиры вводят в заблуждение

Comments

    Ничего не найдено.