web 2.0

Introduction à Parallel Extensions

Bonjour,

Un petit article en gise d'Introduction a Parallel Extensions qui est actuellement CTP de Juin 2008 que vous pouvez télécharger ici
Parallel Extensions est une nouvelle Assembly nommée System.Threading qui a pour but essentiel d'optimiser les traitements sur des architectures multi-coeurs.

Pour donner suite a l'article de Pierrick je vous proposer aujourd'hui la reprise de son code source avec un petit comparatif de performances entre la recherche standard dans le contenu de fichiers et la version avec Parallel Extensions.

Prenons le code suivant pour l'exection en mode "Standard"

class Program
    {
        private static int nbFiles;
        private static int nbMatchFiles;

        private const String dirPath = @"F:\_Dev";
        private const String pattern = "public";

        static void Main(string[] args)
        {
            Console.WriteLine("Searching for : " + pattern);

            nbFiles = 0;
            nbMatchFiles = 0;
            DateTime start = DateTime.Now;

            Console.WriteLine("Search using Standard Processing");
            SearchForStandard(dirPath, pattern, true);
            Console.WriteLine(string.Format("Total files : {0}", nbFiles));
            Console.WriteLine(string.Format("found in files : {0}", nbMatchFiles));
            Console.WriteLine(string.Format("Search Duration : {0}", DateTime.Now.Subtract(start).ToString()));
        }

        private static void SearchForStandard(string path, string text, bool recurse)
        {
            foreach (String file in Directory.GetFiles(path, "*.*"))
            {
                Interlocked.Increment(ref nbFiles);
                FindInFile(file, text);
            }
            if (recurse)
            {
                foreach (String dir in Directory.GetDirectories(path))
                {
                    SearchForStandard(dir, text, recurse);
                }
            }
        }
        private static void FindInFile(string csFilePath, string text)
        {
            if (File.ReadAllText(csFilePath).IndexOf(text) >= 0)
                Interlocked.Increment(ref nbMatchFiles);
        }
    }

 

Nous obtenons donc le résultat suivant

Searching for : public
Search using Standard Processing
Total files : 23210
found in files : 6689
Search Duration : 00:01:17.6940000

 

Passons maintenant a l'execution de cette même application mais cette fois ci en utilisant Parallel Extensions

class Program
    {
        private static int nbFiles;
        private static int nbMatchFiles;

        private const String dirPath = @"F:\_Dev";
        private const String pattern = "public";

        static void Main(string[] args)
        {
            Console.WriteLine("Searching for : " + pattern);

            nbFiles = 0;
            nbMatchFiles = 0;
            DateTime start = DateTime.Now;

            Console.WriteLine("Search using Parallel Processing");
            SearchForParallel(dirPath, pattern, true);
            Console.WriteLine(string.Format("Total files : {0}", nbFiles));
            Console.WriteLine(string.Format("found in files : {0}", nbMatchFiles));
            Console.WriteLine(string.Format("Search Duration : {0}", DateTime.Now.Subtract(start).ToString()));
        }

        private static void SearchForParallel(string path, string text, bool recurse)
        {
            Parallel.ForEach(Directory.GetFiles(path, "*.cs"), csFilePath =>
            {
                Interlocked.Increment(ref nbFiles);
                FindInFile(csFilePath, text);
            });
            if (recurse)
                Parallel.ForEach(Directory.GetDirectories(path),
                    dirName => SearchForParallel(dirName, text, recurse));
        }
        private static void FindInFile(string csFilePath, string text)
        {
            if (File.ReadAllText(csFilePath).IndexOf(text) >= 0)
                Interlocked.Increment(ref nbMatchFiles);
        }
    }

Nous obtenons le résultat suivant :

Search using Parallel Processing
Total files : 6708
found in files : 6059
Search Duration : 00:00:02.3510000

Interressant non ? :)

Voici le code du test au complet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.IO;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        private static int nbFiles;
        private static int nbMatchFiles;

        private const String dirPath = @"F:\_Dev";
        private const String pattern = "public";

        static void Main(string[] args)
        {
            Console.WriteLine("Searching for : " + pattern);

            nbFiles = 0;
            nbMatchFiles = 0;
            DateTime start = DateTime.Now;

            Console.WriteLine("Search using Standard Processing");
            SearchForStandard(dirPath, pattern, true);
            Console.WriteLine(string.Format("Total files : {0}", nbFiles));
            Console.WriteLine(string.Format("found in files : {0}", nbMatchFiles));
            Console.WriteLine(string.Format("Search Duration : {0}", DateTime.Now.Subtract(start).ToString()));

            nbFiles = 0;
            nbMatchFiles = 0;
            start = DateTime.Now;
            Console.WriteLine("Search using Parallel Processing");
            SearchForParallel(dirPath, pattern, true);
            Console.WriteLine(string.Format("Total files : {0}", nbFiles));
            Console.WriteLine(string.Format("found in files : {0}", nbMatchFiles));
            Console.WriteLine(string.Format("Search Duration : {0}", DateTime.Now.Subtract(start).ToString()));
        }


        private static void SearchForStandard(string path, string text, bool recurse)
        {
            foreach (String file in Directory.GetFiles(path, "*.*"))
            {
                Interlocked.Increment(ref nbFiles);
                FindInFile(file, text);
            }
            if (recurse)
            {
                foreach (String dir in Directory.GetDirectories(path))
                {
                    SearchForStandard(dir, text, recurse);
                }
            }
        }

        private static void SearchForParallel(string path, string text, bool recurse)
        {
            Parallel.ForEach(Directory.GetFiles(path, "*.cs"), csFilePath =>
            {
                Interlocked.Increment(ref nbFiles);
                FindInFile(csFilePath, text);
            });
            if (recurse)
                Parallel.ForEach(Directory.GetDirectories(path),
                    dirName => SearchForParallel(dirName, text, recurse));
        }
        private static void FindInFile(string csFilePath, string text)
        {
            if (File.ReadAllText(csFilePath).IndexOf(text) >= 0)
                Interlocked.Increment(ref nbMatchFiles);
        }
    }
}

 

Bon tests et A Bientôt :)



Views(806)

kick it on DotNetKicks.com

Share/Save/Bookmark Subscribe

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

C#

Technorati Profile