Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why was the parallel version slower than the sequential version in this example?

I've been learning a little about parallelism in the last few days, and I came across this example.

I put it side to side with a sequential for loop like this:

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

I was surprised to see that the NoParallel method finished way way faster than the parallel example given at the site.

I have an i5 PC.

I really thought that the Parallel method would finish faster.

Is there a reasonable explanation for this? Maybe I misunderstood something?

like image 768
Mithir Avatar asked May 02 '12 13:05

Mithir


2 Answers

The sequential version was faster because the time spent doing operations on each iteration in your example is very small and there is a fairly significant overhead involved with creating and managing multiple threads.

Parallel programming only increases efficiency when each iteration is sufficiently expensive in terms of processor time.

like image 63
Ryathal Avatar answered Oct 28 '22 10:10

Ryathal


I think that's because the loop performs a very simple, very fast operation.

In the case of the non-parallel version that's all it does. But the parallel version has to invoke a delegate. Invoking a delegate is quite fast and usually you don't have to worry how often you do that. But in this extreme case, it's what makes the difference. I can easily imagine that invoking a delegate will be, say, ten times slower (or more, I have no idea what the exact ratio is) than adding a number from an array.

like image 24
svick Avatar answered Oct 28 '22 11:10

svick