Сравнение скоростей распаковки архивов

Дата публикации: 26.01.2011
Дата редактирования: не редактировалась
Состояние: завершена

Исходные данные:

    На сервере находится zip-архив (несжатый), содержащий в себе пару каталогов. В одном каталоге более 334 маленьких файла, во втором - 677 других так же маленьких файлов. Общий объём архива - 38Мб.

Задача:

    Нужно распаковать данный архив на локальной машине, с как можно меньшими временными затратами.

Предварительное рассуждение

    Распаковку можно выполнять в едином потоке, а можно попробовать раскидать её по нескольким процессорам и потокам, воспользовавшись PLINQ и TPL. Для распаковки архива использую эту библиотеку.

Итак, поехали...

Исходный код (C# 4.0):

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using Ionic.Zip;
   6:  using System.Threading.Tasks;
   7:   
   8:  namespace ZipTest {
   9:      public class Class1 {
  10:   
  11:          static string zipFile = @"\\Hyprostroy\dfs\SystemFolder\tools\AutoCAD tools\GPSM.CAD\Common\Common.zip";
  12:   
  13:          public static void Main() {
  14:              Console.Title="Сравнение скорости распаковки архива с распараллеливанием задач и без него.";
  15:              TaskFactory factory = new TaskFactory();
  16:   
  17:              //Запускаем на исполнение первый метод
  18:              factory.StartNew(Method1);
  19:              //Параллельно запускаем на исполнение второй метод
  20:              factory.StartNew(Method2);
  21:              Console.Read();
  22:          }
  23:   
  24:          static void Method1() {
  25:              //Распаковка без использования параллельной обработки данных
  26:              string targetDir = @"D:\000";
  27:              DateTime startTime = DateTime.Now;
  28:              Console.WriteLine("Запущен вариант без распараллеливания...");
  29:              using (ZipFile z = new ZipFile(zipFile)) {
  30:                  foreach (ZipEntry item in z)
  31:                      item.Extract(targetDir);
  32:              }
  33:              DateTime endTime = DateTime.Now;
  34:              Console.WriteLine("Общее время распаковки без распараллеливания: {0} сек.", (endTime - startTime).Seconds);
  35:          }
  36:   
  37:          static void Method2() {
  38:              //Распаковка с использованием параллельной обработки данных
  39:              Console.WriteLine("Запущен вариант с распараллеливанием...");
  40:              DateTime startTime2 = DateTime.Now;
  41:              string targetDir1 = @"D:\111";
  42:              using (ZipFile z2 = new ZipFile(zipFile))
  43:                  z2.AsParallel().All(n => { n.Extract(targetDir1); return true; });
  44:              DateTime endTime2 = DateTime.Now;
  45:              Console.WriteLine("Общее время распаковки c распараллеливанием обработки данных: {0} сек.", (endTime2 - startTime2).Seconds);
  46:              Console.Read();
  47:          }
  48:      }
  49:  }

    Если параллельно запущены оба метода, получаем следующий результат:


    Если закомментировать строку 18, получаем такой результат:



    Если раскомментировать строку 18 и закомментировать строку 20 - результат такой:


    Как видим, в данном случае распараллеливание операции распаковки не помогло ускорить процесс распаковки архива...

Comments