C#でZIPファイルを作成し圧縮・無圧縮でサイズと展開速度を確認する。

C# コンピュータ
C#

複数のPNG形式などの画像ファイルをzipファイルにアーカイブして保存しています。
PNG形式で圧縮済みのファイルをzipで圧縮しても余り小さくなることは無いので、無圧縮にして展開速度を速めた方がメリットが大きそうです。簡単なプログラムを組んで確認してみたいと思います。

ZIPファイルの作成

圧縮・無圧縮はZipArchiveEntryの作成時のオプションCompressionLevelで指定

using System.IO.Compression;

const string targetFile = @"H:\csharp\dotnet8\console\ZipExtractSpeedTest01\202406041040.png";

const string zipFile1 = @"H:\csharp\dotnet8\console\ZipExtractSpeedTest01\Optimal.zip";

if (System.IO.Path.Exists(zipFile1))
    System.IO.File.Delete(zipFile1);

var zip1 = ZipFile.Open(zipFile1, ZipArchiveMode.Update, System.Text.Encoding.UTF8);
var entry1 = zip1.CreateEntryFromFile(targetFile, System.IO.Path.GetFileName(targetFile), CompressionLevel.Optimal);
zip1.Entries.Append(entry1);
zip1.Dispose();

const string zipFile2 = @"H:\csharp\dotnet8\console\ZipExtractSpeedTest01\NoCompress.zip";

if (System.IO.Path.Exists(zipFile2))
    System.IO.File.Delete(zipFile2);

var zip2 = ZipFile.Open(zipFile2, ZipArchiveMode.Update, System.Text.Encoding.UTF8);
var entry2 = zip2.CreateEntryFromFile(targetFile, System.IO.Path.GetFileName(targetFile), CompressionLevel.NoCompression);
zip2.Entries.Append(entry2);
zip2.Dispose();

1.ZIPファイルに登録するファイル(202406041040.png)のサイズ
718,489 バイト
2.圧縮されたZIPファイル(Optimal.zip)のサイズ
718,174 バイト
3.無圧縮のZIPファイル(NoCompress.zip)のサイズ
718,619 バイト

サイズは2.<1.<3.の順番になっているので順当。

ファイルの展開速度を計測

MemoryStream ms3 = new();
var zip3 = ZipFile.OpenRead(zipFile1);
var stream3 = zip3.GetEntry(System.IO.Path.GetFileName(targetFile))?.Open();
if (stream3 is not null)
{
    Stopwatch sw = new();
    sw.Start();
    stream3.CopyTo(ms3);
    sw.Stop();
    Console.WriteLine("Optimal Extract:{0}ms Length:{1}byte", sw.ElapsedMilliseconds, ms3.Length);
    stream3.Close();
}
zip3.Dispose();
ms3.Dispose();

MemoryStream ms4 = new();
var zip4 = ZipFile.OpenRead(zipFile2);
var stream4 = zip4.GetEntry(System.IO.Path.GetFileName(targetFile))?.Open();
if (stream4 is not null)
{
    Stopwatch sw = new();
    sw.Start();
    stream4.CopyTo(ms4);
    sw.Stop();
    Console.WriteLine("NoCompress Extract:{0}ms Length:{1}byte", sw.ElapsedMilliseconds, ms4.Length);
    stream4.Close();
}
zip4.Dispose();
ms4.Dispose();

実行結果

Optimal Extract:8ms Length:718489byte
NoCompress Extract:1ms Length:718489byte

展開後のファイルサイズはPNGファイルのファイルサイズですので展開されているようです。
速度差は7msという結果になり、無圧縮の方が速いという結果になりました。

コメント