I tried a very minimal example:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Collections.Concurrent; using System.Diagnostics; namespace TPLExample { class Program { static void Main(string[] args) { int[] dataItems = new int[100]; double[] resultItems = new double[100]; for (int i = 0; i < dataItems.Length; ++i) { dataItems[i] = i; } Stopwatch stopwatch = new Stopwatch(); stopwatch.Reset(); stopwatch.Start(); Parallel.For(0, dataItems.Length, (index) => { resultItems[index] = Math.Pow(dataItems[index], 2); }); stopwatch.Stop(); Console.WriteLine("TPL Time elapsed: {0}", stopwatch.Elapsed); stopwatch.Reset(); stopwatch.Start(); for (int i = 0; i < dataItems.Length; ++i) { resultItems[i] = Math.Pow(dataItems[i], 2); } stopwatch.Stop(); Console.WriteLine("Sequential Time elapsed: {0}", stopwatch.Elapsed); WaitForEnterKey(); } public static void WaitForEnterKey() { Console.WriteLine("Press enter to finish"); Console.ReadLine(); } public static void PrintMessage() { Console.WriteLine("Message printed"); } } }
The output was:
TPL Time elapsed: 00:00:00.0010670 Sequential Time elapsed: 00:00:00.0000178 Press enter to finish
Sequential loop faster than TPL! How is this possible? In my opinion, the calculation inside Parallel.For
will be done in parallel, should it be faster?
source share