Почему параллельная версия была медленнее, чем последовательная версия в этом примере?
В последние несколько дней я немного изучил параллелизм и наткнулся на этот пример.
Я положил его рядом с последовательным циклом 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.
Я действительно думал, что параллельный метод закончится быстрее.
Есть ли этому разумное объяснение? Может Быть, Я ... что-то не так понял?
3 ответов:
Последовательная версия была быстрее, потому что время, затрачиваемое на выполнение операций на каждой итерации в вашем примере, очень мало, и есть довольно значительные накладные расходы, связанные с созданием и управлением несколькими потоками.
Параллельное программирование повышает эффективность только тогда, когда каждая итерация достаточно затратна с точки зрения процессорного времени.
Я думаю, что это потому, что цикл выполняет очень простую, очень быструю операцию.
В случае непараллельной версии это все, что он делает. Но параллельная версия должна вызывать делегат. Вызов делегата происходит довольно быстро, и обычно вам не нужно беспокоиться о том, как часто вы это делаете. Но в этом крайнем случае, это то, что имеет значение. Я легко могу себе представить, что вызов делегата будет, скажем, в десять раз медленнее (или больше, я понятия не имею, каково точное соотношение), чем добавление число из массива.
Вы не сравниваете яблоки с апельсинами.
Пример, на который вы ссылаетесь, не столько о параллелизме или параллелизме, сколько ооб отключении состояния от совместного использования различными потоками . Работа , которую он делает, - это соломенный человек, чтобы просто показать, что что-то делается.
Итак, то, что вы сравниваете, похоже на сравнение автомобиля F1 с топовым Драгстером. Каждый преуспевает в движении быстро , но быстро относительно контекст , который в этом и большинстве случаев является узкоспециализированным. Не можете конкурировать на другие узкоспециализированные компетенции.
Уроки, которые нужно выучить
- одновременно != быстрее
- плохо продуманные ориентиры вводят в заблуждение
Comments