PNGファイルの圧縮率と展開速度

C# コンピュータ
C#

PNGファイルの圧縮率を高めるとファイルサイズは小さくなり、その分、短時間で読み込めます。
しかし圧縮を展開するために処理時間が必要となります。

では、高圧縮と低圧縮でどちらが画像のロード時間が短いでしょうか?

処理するパソコンの能力に依存することになりますが、自分のパソコン環境でざっくりとしたテストをしてみたいと思います。

検証用パソコンのCPU
Intel Celeron 3965U @2.20GHz

画像サイズ
3840×1280 24ビットカラー(640×320をwaifu2xで6倍に拡大したもの)

最適化
OptiPNG

ファイルをSSDに置いた場合

ファイルサイズ:22156158Byte(約21MByte)
読み込み:159ミリ秒
展開時間:131ミリ秒
トータル:290ミリ秒
(読み込み時間の算出は、2回実行しキャッシュの利かない1回目とキャッシュが利いた2回目の差とした。)

ファイルサイズ:3139345Byte(約3MByte)
読み込み:33ミリ秒
展開時間:171ミリ秒
トータル:204ミリ秒

PNGファイルを最適化したことにより、ファイルサイズが減少(21M→3M)し読み込み時間が126ミリ秒短縮された。展開時間は40ミリ秒増加した。トータルは86ミリ秒短縮された。

次に、より遅いストレージで試して見るべく同じファイルを共有ファイルとして実行してみます。

ファイルを共有フォルダに置いた場合

ファイルサイズ:22156158Byte(約21MByte)
読み込み:8995ミリ秒
展開時間:161ミリ秒
トータル:9156ミリ秒

ファイルサイズ:3139345Byte(約3MByte)
読み込み:1000ミリ秒
展開時間:171ミリ秒
トータル時間:1171ミリ秒

読み込み時間が7995ミリ秒と大幅に短縮された。展開時間は10ミリ秒増加。トータルは7985ミリ秒短縮された。

低圧縮と高圧縮で展開に要する時間差は概ね10~40ミリ秒ほどで、読み込みにかかる時間差と比べ同等かより小さく、高圧縮にした方がトータル時間が短縮される結果となりました。ゆえに、PNGファイルは最適化し高圧縮にした方が読み込みレスポンスが向上する結果になります。

とまぁ、私のパソコン環境での検証結果となるわけですが、環境が異なると結果もおのずと異なります。
それでも今回検証に使ったパソコンは比較的新し目ではありますが、決してハイスペックなモデルでは無いので、多くのパソコンで同じような結果になるのではないかと思います。もしPNGの展開に足を引っ張られるようであれば、パソコンを買い替えると幸せになるかもしれません。

検証用プログラムのソース(C#)

// 
// 画像ファイルの読み込み時間計測
// 
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;

// コンパイル
// csc PictureLoadTime.cs

class Form1 : Form
{
    // ピクチャボックス
    PictureBox picbox = new PictureBox
    {
        Dock = DockStyle.Fill,
    };

    // コンストラクタ
    Form1()
    {
        // コントロールの登録
        Controls.Add(picbox);

        // コマンドライン引数からファイルパスを取得
        string[] args = System.Environment.GetCommandLineArgs();
        if (args.Length <= 1) return;

        string file = args[1];
        if (!File.Exists(file)) return;        

        Console.WriteLine("LoadFile:{0}", file);
        Console.WriteLine("ファイルサイズ:{0}Byte", (new FileInfo(file)).Length);

        // Stopwatchオブジェクトの生成
        var sw = new System.Diagnostics.Stopwatch();

        // 計測開始
        sw.Start();

        // 画像ファイルの読み込み
        Bitmap bmp = new Bitmap(file);

        // 画像ファイルを描画
        picbox.Image = bmp;

        // 計測停止
        sw.Stop();
        Console.WriteLine("ロード時間:{0}ミリ秒", sw.ElapsedMilliseconds);
    }
    // エントリポイント
    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }
}

コメント