Небольшое тестирование двух библиотек для работы с ZIP архивами (язык C#)

    Архивирование

    Не раз приходилось работать с zip архивами с помощью C#, в моих случаях — это было скачивание архива с базой, потом извлекал базу на диск, если это был не текстовый файл, то динамически подключал базу данных, иначе просто считывал необходимые мне данные. Для этих целей я использовал ZipStorer, он мне нравиться тем, что очень просто делает возложенную на него работу, мало весит и является классом, который с минимальным количеством телодвижений оказывается в исполняемом файле. Сегодня я решил попробовать что-то другое, для чего выбрал две библиотеки SharpZipLib и DotNetZip, после чего провел небольшое тестирование, чтобы понять какая из них может мне быть полезной в будущем.

    Раз уже упомянул о ZipStorer, то покажу пример работы с ним, достаточно добавить класс ZipStorer.cs и написать такой метод, после чего всё будет работать:
      private void Unzip(string fileInput, string saveFile)
        {
            // Open an existing zip file for reading
            using (ZipStorer zip = ZipStorer.Open(fileInput, FileAccess.Read))
            {
              // Read the central directory collection
              List<ZipStorer.ZipFileEntry> dir = zip.ReadCentralDir();

              // Look for the desired file
              string DBfile = string.Empty;
              foreach (ZipStorer.ZipFileEntry entry in dir)
              {
                if (Path.GetFileName(entry.FilenameInZip).ToLower().IndexOf(".txt") != -1)
                {
                  DBfile = Path.GetFileName(entry.FilenameInZip);
                  zip.ExtractFile(entry, saveFile + DBfile);

                  //Now we can connect to database or read file
                }
              }
            }
        }


    * This source code was highlighted with Source Code Highlighter.

    Теперь узнаем насколько просто будет проделать подобные вещи для SharpZipLib и DotNetZip. Примеры работы с SharpZipLib можно найти по данной ссылке или официальный источник, для DotNetZip примеры работы будут сразу в архиве с библиотекой.

    Лицензии:
    SharpZipLib — GPL
    DotNetZip — Ms-PL

    В этот раз я решил не переводить информацию с сайтов разработчиков, скажу лишь, что обе библиотеки имеют поддержку Compact Framework и могут использоваться в веб-приложениях. Размер обеих библиотек около 200 килобайт, правда для DotNetZip я беру «Reduced» версию, полная версия занимает около 400 килобайт, что в два раза больше. Теперь перейдём непосредственно к тесту, в отличии от ZipStorer, мы будем архивировать данные, а сравнивать будем степень сжатия и скорость. Архивировать будем с уровнем, установленным по умолчанию, для DotNetZip свойство CompressionLevel установлено в «Default» или «Level6», а метод GetLevel() для SharpZipLib возвращает «6».

    Библиотеки имеют классы с одинаковыми именами, поэтому пространства я подключил таким образом:
    using test1 = Ionic.Zip;
    using test2 = ICSharpCode.SharpZipLib.Zip;


    Для архивирования с помощью DotNetZip достаточно следующего кода:
          string ZipFileToCreate = Application.StartupPath + @"\test1.zip";
          string FileToZip = textBoxFile.Text;
          using (test1.ZipFile zip = new test1.ZipFile())
          {
             test1.ZipEntry ze = zip.AddFile(FileToZip);
             zip.Save(ZipFileToCreate);
          }


    * This source code was highlighted with Source Code Highlighter.

    Для SharpZipLib нужно немного больше написать:
            string file = textBoxFile.Text;
            using (test2.ZipOutputStream s = new test2.ZipOutputStream(File.Create(Application.StartupPath + @"\test2.zip")))
            {
              byte[] buffer = new byte[4096];
              test2.ZipEntry entry = new test2.ZipEntry(Path.GetFileName(file));
              s.PutNextEntry(entry);
              using (FileStream fs = File.OpenRead(file))
              {
                int sourceBytes;
                do
                {
                  sourceBytes = fs.Read(buffer, 0, buffer.Length);
                  s.Write(buffer, 0, sourceBytes);
                } while (sourceBytes > 0);
              }
              s.Finish();
              s.Close();
            }


    * This source code was highlighted with Source Code Highlighter.

    Оба куска кода я взял из официальных примеров и удалил комментарии для экономии места. Результаты работы можно посмотреть в данной таблице:

    Результыты теста

    Файлы для теста были сгенерированы искусственно, поэтому столь красивый результат сжатия, чтобы посмотреть насколько ситуация изменится с реальными данными, я скачаю список ru доменов с сайта регистратора, архив, который я скачал, будет эталоном, его размер равен 28 043 005 байт, извлеку данные из архива и ещё раз проверю две библиотеки:

    Результыты теста

    Вывод


    Исходя из результатов, скоростные характеристики лучше у DotNetZip, но в тоже время сжатие данных у данной библиотеки хуже, напомню, что степень сжатия я не менял и она у обеих библиотек равна была 6. Лично мне визуально больше понравилась DotNetZip, на ней я и остановлюсь, число скачавших данную библиотеку больше 100 тысяч говорит о том, что выбор мой не одинок.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 20
    • +2
      На самом деле работа с SharpZipLib не требует столько кода, как вы написали :) Если немного разобраться с его нутром. Однако есть некоторые не прямые моменты, особенно это касается добавление файла в определенную папку архива. Вы еще забыли перечислить алгоритмы сжатия, которые поддерживает SharpZipLib. Для быстрой работы у него есть классик FastZip. Увы лицензия на него, как я понял не позволяет использовать в платных продуктах.
      • 0
        За основу я взял пример «CreateZipFile», FastZip я тоже видел в примерах, но обилие дополнительного кода в примере отбило желание его использовать. Касательно алгоритмов сжатия, то это Zip, GZip, Tar и BZip2, но в статье я упомянул, что в этот раз не буду заниматься переводом, полное описание обеих библиотек доступно по ссылкам.
        • 0
          Касательно алгоритмов сжатия, то это Zip, GZip, Tar и BZip2

          А какие из них можно использовать в ZIP-файлах, не опасаясь что у кого-то сегодня могут возникнуть затруднения с его открытием?
          • 0
            Не очень понятен вопрос, ZIP архивами являются только первые. Обе библиотеки делают стандартные архивы, для DotNetZip ответ даже находится на главной странице (искать можно по строке «If I create a zipfile with this library, can I open it from within a Java/PHP/Python/C/Perl application? From within WinRar/WinZIP?»). А вот пример «проблем» для SharpZipLib, т.е. устранение проблем совместимости сводится в настройке. Хотя с другой стороны, в комментариях ниже, упоминается о проблемах перехода с одной библиотеки на другую при работе с gzip.
            • 0
              Не очень понятен вопрос, ZIP архивами являются только первые.

              А, ясно. Я думал все (не заметил правда что Вы и tar там перечислили). Думал я так потому, что AFAIK ZIP-это какбы типа контейнер (по типу AVI/MKV/итп для видео, которое внутри может быть в виде сжатом самыми разными кодеками). Я в своё время где-то читал что формат ZIP развивается и в него добавляются всё новые современные методы компрессии (например в версии формата ZIP 2.0 была добавлена поддержка метода Deflate, который использовался в 7z). И это хоть само по себе и здорово, но логика подсказывает что, к примеру, встроенная в WinXP зиповалка скорее всего не прожуёт zip-файл, в котором данные сжаты по какому-нибудь методу, добавленному в ZIP-стандарт только в последние годы.
        • 0
          Насчет лицензии SharpZipLib вы не правы, как и автор поста, т.к. там есть прямая оговорка, разрешающая использовать SharpZipLib в коммерческих проектах с закрытым исходным кодом.
      • –7
        Это все как-то прозаично. Вот если бы вы алгоритм ZIP под GPU написали или, скажем, показали как это хардвэрно на FPGA крутится, было бы интересно.
        • 0
          интересно было бы услышать об использовании многоядерности современных процессоров в одном и другом случае, может быть оптимизация под многопоточность так влияет?
          • 0
            Хороший комментарий, т.к. забыл упомянуть, что тестирование велось на компьютере с AMD Athlon 64 X2 Dual Core Processor 3800+ (2,01 ГГц) и 2 Гб оперативной памяти.
            • +1
              а как с загрузкой ядер?
              в обоих случаях одинаковая? просто такая большая разница вызывает подозрение что один из вариантов использует многопоточность, а другой — нет
              • +1
                1 — DotNetZip
                2 — SharpZipLib
                3 — ZipStorer (упоминается в комментариях ниже)

                another test
          • 0
            1. А если попробовать добиться похожих результатов в итоговых размерах файлах и сравнить время?
            2. Может таки включить в тестирование и ZipStorer? Тогда будет более понятно, почему вы заменяете его на DotNetZip
            • 0
              А еще было бы неплохо сравнить скорость распаковки.
              • 0
                1. К сожалению уже поздно, т.к. тестовые файлы я удалил, придется переделывать весь тест.
                2. Немного не справедливо сравнивать ZipStorer с этими двумя библиотеками, но результаты получились такие для режима Deflate: 37 520 469 байт, 13687 мс. По скорости близка к DotNetZip, но вот сжатие практически на 30 процентов хуже.
              • 0
                Есть ещё такая небольшая подстава в том, что не всегда легко получится с одной библиотеки в проекте «пересесть» на другую.
                Из личного печального опыта: gzip, запакованный SharpZipLib не всегда разворачивается DotNetZip-ом.
                • 0
                  К плюсам SharpZipLib можно отнести также реализацию алгоритма BZip2 и наличие версий под Silverlight и WP7 (последняя немного с ограниченной функциональностью).
                  • +2
                    Год назад я тестировал разные библиотеки для работы с Zip. Использовал сначала SharpZipLib, потом выяснилось, что в этой библиотеке есть особенность: мне необходимо было проверять наличие пароля у готового архива, т.е. распаковывать только архив, защищенный паролем, с SharpZipLib это не удалось сделать (было давно, может я не разобрался), с DotNetZip все работает.
                    Библиотеку использовал на устройстве с Windows CE с .NET CF, сохранилась табличка сравнения скорости архивации, при разном уровне сжатия:

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.