Visual Studio 2010 has some interesting new features, one of which is parallel programming. This simple example, written in C# and F#, tests the difference between serial and parallel computations of Fibonacci numbers. The example uses the System.Threading.Tasks.Parallel.For method. Indeed, there is about a 4-fold improvement on my quad-core multiprocessor for long computations but not for short computations. There is a trade-off between the size of the computation versus the overhead to create, schedule, and synchronize threads.
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
Int32 fib(Int32 x)
{
if (x <= 2)
return 1;
else
return fib(x - 1) + fib(x - 2);
}
static void Main(string[] args)
{
DateTime current;
Program p = new Program();
Stopwatch sw = new Stopwatch();
double s = 0;
sw.Reset();
current = DateTime.Now;
Console.WriteLine(current);
sw.Start();
for (int i = 0; i < 40; ++i)
p.fib(i);
sw.Stop();
s = sw.Elapsed.TotalMilliseconds;
System.Console.WriteLine("Serial = " + s);
current = DateTime.Now;
Console.WriteLine(current);
double l = 0;
sw.Reset();
sw.Start();
Parallel.For(0, 40, j =>
{
p.fib(j);
});
sw.Stop();
l = sw.Elapsed.TotalMilliseconds;
System.Console.WriteLine("Parallel = " + l);
current = DateTime.Now;
Console.WriteLine(current);
sw.Reset();
sw.Start();
for (int i = 0; i < 10; ++i)
p.fib(40);
sw.Stop();
s = sw.Elapsed.TotalMilliseconds;
System.Console.WriteLine("Serial2 = " + s);
current = DateTime.Now;
Console.WriteLine(current);
sw.Reset();
sw.Start();
Parallel.For(0, 10, j =>
{
p.fib(40);
});
sw.Stop();
l = sw.Elapsed.TotalMilliseconds;
System.Console.WriteLine("Parallel = " + l);
current = DateTime.Now;
Console.WriteLine(current);
}
}
}
Output:
3/27/2010 6:54:22 AM Serial = 3243.8431 3/27/2010 6:54:25 AM Parallel = 3094.8497 3/27/2010 6:54:28 AM Serial2 = 20070.4749 3/27/2010 6:54:48 AM Parallel = 6129.799 3/27/2010 6:54:54 AM
F#:
// Learn more about F# at http://fsharp.net
let rec fib x = if x <= 2 then 1 else fib(x-1) + fib(x-2)
let sw = System.Diagnostics.Stopwatch();
sw.Reset();
let c0 = System.DateTime.Now
System.Console.WriteLine(c0);
sw.Start();
for x in 0..40 do
fib(x);
done
sw.Stop();
let s = sw.ElapsedMilliseconds;
System.Console.WriteLine(s);
let c1 = System.DateTime.Now
System.Console.WriteLine(c1);
sw.Reset();
sw.Start();
Async.Parallel [ for x in 0..40 -> async { return fib(x) } ] |> Async.RunSynchronously
sw.Stop();
let p = sw.ElapsedMilliseconds;
System.Console.WriteLine(p);
let c2 = System.DateTime.Now
System.Console.WriteLine(c2);
sw.Reset();
sw.Start();
for x in 0..10 do
fib(40);
done
sw.Stop();
let s2 = sw.ElapsedMilliseconds;
System.Console.WriteLine(s2);
let c3 = System.DateTime.Now
System.Console.WriteLine(c3);
sw.Reset();
sw.Start();
Async.Parallel [ for x in 0..10 -> async { return fib(40) } ] |> Async.RunSynchronously
sw.Stop();
let p2 = sw.ElapsedMilliseconds;
System.Console.WriteLine(p2);
let c4 = System.DateTime.Now
System.Console.WriteLine(c4);
let y = 1
Output:
3/27/2010 7:01:39 AM 5450 3/27/2010 7:01:44 AM 2351 3/27/2010 7:01:47 AM 22893 3/27/2010 7:02:10 AM 6663 3/27/2010 7:02:16 AM