Utilizzare il Parallel For ed il Parallel ForEach in .NET 4.0

L’utilizzo del Parallel Programming in .NET 4.0 va oltre a quanto già detto qui: di fatto all’interno del namespace System.Threading.Tasks esiste una classe Parallel che permette di effettuare cicli sfruttando più Threads, in modo da abbassare il tempo necessario all’iterazione.

Lo snippet seguente mostra un semplicissimo ciclo di 50 elementi con e senza il Parallel For, con risultati nettamente a vantaggio dell’istruzione Parallel.For.

static void Main(string[] args)
{
    Console.WriteLine("MTID={0}", Thread.CurrentThread.ManagedThreadId);

    ParallelMethod();
    NonParallelMethod();
    
    Console.WriteLine("\nFinished...");
    Console.ReadKey(true);
}

static void NonParallelMethod()
{
    Stopwatch sw = Stopwatch.StartNew();

    for (int i = 0; i < 50; i++)
    {
        Console.WriteLine("ThreadID={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i);
        SimulateProcessing();
    }

    sw.Stop();

    Console.WriteLine("It Took {0} ms with simple for", sw.ElapsedMilliseconds);
}

static void ParallelMethod()
{
    Stopwatch sw = Stopwatch.StartNew();

    Parallel.For(0, 50, i =>
    {
        Console.WriteLine("ThreadID={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i);

        SimulateProcessing();
    });

    sw.Stop();

    Console.WriteLine("It Took {0} ms with Parallel For", sw.ElapsedMilliseconds);
}

static void SimulateProcessing()
{
    Thread.SpinWait(80000000);
}

Dallo screenshot seguente è possibile capire come l’utilizzo del Parallel ci permette di sfruttare a meglio l’hardware a disposizione in quanto utilizza entrambi i processori, a differenza del classico ciclo for che ne sfrutta uno solo.

001r

Ovviamente la classe Parallel non offre soltanto metodi per il ciclo for ma anche per il ForEach che funziona allo stesso modo, come mostrato di seguito:

static void ParallelForEach()
{
    int[] values = Enumerable.Range(1,50).ToArray();

    Parallel.ForEach<int>(values, i =>
    {
        Console.WriteLine("ThreadID={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i);

        SimulateProcessing();
    });
}

Anche questo, come il precedente, resta un test dimostrativo della semplicità con cui si può sfruttare il Parallel Programming con il .NET Framework 4.0 e del fatto che i risultati ottenibili sono influenzabili dall’hardware che si ha a disposizione, numero di processori in primis.

Parallel.Ciauz()


Comments