複数の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という結果になり、無圧縮の方が速いという結果になりました。
コメント