Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2011, 15:51   #1
tumanovalex
Пользователь
 
Регистрация: 07.03.2011
Сообщений: 83
Вопрос Сравнение производительности при наличиии и отсутствии распараллеливания

В программе подсчитываю md5 для небольших файлов в заданной директории и определяю время работы при последовательном подсчете md5 и подсчете md5 для каждого файла при распараллеливании. Раньше с потоками не работал, не судите строго. Сделал так:
Код:
namespace MyThreadQ
{
  class Program
  {
    private static Int32 iMode = 0; // 0 - без потоков, 1 - с потоками, 2 - Parallel

    private static byte[] btFile;

    private static ArrayList sRes = new ArrayList();

    static void Main(string[] args)
    {
      String[] sFileNames = Directory.GetFiles("D:\\Temp");
      Stopwatch sw        = new Stopwatch();
      sw.Start();
      switch (iMode)
      {
        case 0:
          foreach (string str in sFileNames)
          {
            btFile = File.ReadAllBytes(str);
            sRes.Add(getMd5Hash(btFile));
          } // foreach (string str in sFileNames)
          break;
        case 1:
          foreach (string str in sFileNames)
          {
            var threads = new List<Thread>();
            var thread  = new Thread(new ParameterizedThreadStart(thrFun)); 
            threads.Add(thread);
            thread.Start();
            foreach (var thread1 in threads)
              thread1.Join();
            break;
          } // foreach (string str in sFileNames)
          break;
        case 2:
          //Parallel.ForEach()          
          {
          
          } // Parallel.ForEach (string str in sFileNames)
          break;
        default:
          return;
      } //switch (iMode)
      sw.Stop();
      Console.WriteLine("Time: {0} MD5 {1} files", sw.ElapsedMilliseconds, sRes.Count);
      for (Int32 i = 0; i < sRes.Count; i++)
      {
        Console.WriteLine("{0}", sRes[i]);
      }
      Console.Read();
    } // static void Main(string[] args)

    static private string getMd5Hash(byte[] input)
    {
      MD5 md5Hasher = MD5.Create();
      byte[] data = md5Hasher.ComputeHash(input);
      StringBuilder sBuilder = new StringBuilder();
      for (int i = 0; i < data.Length; i++)
      {
        sBuilder.Append(data[i].ToString("x2"));
      }
      return sBuilder.ToString();
    }

    private static void thrFun(Object bt)
    {
      btFile = (byte[]) bt;
      sRes.Add(getMd5Hash(btFile));
    }
  } // class Program
} // namespace MyThread
Для обучных потоков (iMode = 1) получаю ArgumentNullException в функции getMd5Hash в строке
Код:
byte[] data = md5Hasher.ComputeHash(input);
Помогите, пожалуйста, разобраться со следующими вопросами:
1. Что нужно сделать, чтобы моя многопоточная программа с обычными потоками работала правильно.
2. Как правильно записать решение моей задачи для использования Parallel.ForEach.
3. Как правильно записать решение моей задачи для использования AsParallel.
Документацию читал, но самостоятельно не смог разобраться. Прикрепляю проект.
Вложения
Тип файла: zip MyParallelVS10.zip (3.6 Кб, 8 просмотров)
tumanovalex вне форума Ответить с цитированием
Старый 17.06.2011, 16:09   #2
fenryr
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 28
По умолчанию

для многопоточного примерно так
Код:
 var threads = new List<Thread>();
                    foreach (string str in sFileNames)
                    {                  
                        var thread = new Thread(new ParameterizedThreadStart(thrFun)); //=> Interlocked.Add(ref sRes, 
                        threads.Add(thread);
                        thread.Start(File.ReadAllBytes(str));                       
                    } // foreach (string str in sFileNames)
                    foreach (var thread1 in threads)
                        thread1.Join();
fenryr вне форума Ответить с цитированием
Старый 20.06.2011, 09:42   #3
tumanovalex
Пользователь
 
Регистрация: 07.03.2011
Сообщений: 83
По умолчанию

Не получается, выводит только md5 для первого файла, а у меня их 20 штук. При отсутствии многопоточности все работает нормально
tumanovalex вне форума Ответить с цитированием
Старый 20.06.2011, 14:52   #4
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Код:
case 1:
          foreach (string str in sFileNames)
          {
            var threads = new List<Thread>();
            var thread  = new Thread(new ParameterizedThreadStart(thrFun)); 
            threads.Add(thread);
            thread.Start();
          } 
         foreach (var thread1 in threads)
              thread1.Join();
          break;
        case 2:
Так должно быть (не проверял), так как вылетаешь стразу на после первого фора на break-e. Мог бы F8 понять...
Guy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание программы при отсутствии подключения dolphin705 Работа с сетью в Delphi 0 17.01.2011 02:05
Почему _kbhit возвращает TRUE при отсутствии нажатий? Catharsis Общие вопросы C/C++ 3 01.08.2010 17:40
Проблема производительности при работе с таблицей в Excel 2007 Crokozayaz Microsoft Office Excel 3 21.07.2010 16:27
Информация о производительности Blade Общие вопросы C/C++ 2 24.11.2009 23:04
Подскажите задачу удобную для распараллеливания Vityalo Софт 10 14.09.2009 15:02