LoginSignup
10
3

More than 3 years have passed since last update.

libwebp のバージョンをあげると速くなる

Last updated at Posted at 2019-01-27

きっかけ

こちらの呟きを見て気になったので雑にエンコード速度を計測してみました。(多分、この呟きはデコードを意図してそうですが、今回はエンコードが対象)
結論としては 0.5.0 より前からバージョンアップすると速くなります。なお、デコードは速すぎて測るのが面倒で調べてません。

測定環境

  • MacBook Pro 2018 15inch 安い方のモデル

    • 2.2GHz Intel Core i7
    • メモリ32GB 2400MHz DDR4
  • macOS Mojave (10.14.3)

    • cc: Apple LLVM version 10.0.0 (clang-1000.10.44.4)
    • libwebp: 0.2.0 〜 1.0.2 (0.4.4 はコンパイルエラーが出たので除外)
    • libpng: 1.6.36

利用ツール

libwebp 付属の cwebp コマンドは PNG から WebP に変換するので、WebP のエンコードの時間がだいたいわかります。(PNG のデコードはめっちゃ速いと仮定)

dwebp で WebP のデコード時間も計測できれば良いのですが、PNG エンコードの時間が支配的なので諦めました。

対象画像

% identify IMG_0982.png
IMG_0982.png PNG 4032x3024 4032x3024+0+0 16-bit sRGB 18.0796MiB 0.000u 0:00.000

Qiita はこのサイズの画像をアップロード出来ないようで、縮小版で失礼します。

IMG_0982-640.png

テスト作業

libwebp ビルド

tarball はここから取ってきました。

~/src/graphics/libwebp% ls
libwebp-0.2.0.tar.gz    libwebp-0.4.3.tar.gz    libwebp-0.6.0.tar.gz
libwebp-0.3.0.tar.gz    libwebp-0.4.4.tar.gz    libwebp-0.6.1.tar.gz
libwebp-0.4.0.tar.gz    libwebp-0.5.0.tar.gz    libwebp-1.0.0.tar.gz
libwebp-0.4.1.tar.gz    libwebp-0.5.1.tar.gz    libwebp-1.0.1.tar.gz
libwebp-0.4.2.tar.gz    libwebp-0.5.2.tar.gz    libwebp-1.0.2.tar.gz
  • 展開
~/src/graphics/libwebp% ls
libwebp-0.2.0   libwebp-0.4.1   libwebp-0.4.4   libwebp-0.5.2   libwebp-1.0.0
libwebp-0.3.0   libwebp-0.4.2   libwebp-0.5.0   libwebp-0.6.0   libwebp-1.0.1
libwebp-0.4.0   libwebp-0.4.3   libwebp-0.5.1   libwebp-0.6.1   libwebp-1.0.2
  • まとめてビルド&インストール
for d in libwebp-?.?.?;
  do v=${d#libwebp-} ; echo $v 
  ( cd $d ; ./autogen.sh ; ./configure --prefix=$HOME/libwebp/$v ; make install ) ;
  done
~/libwebp% ls
0.2.0   0.4.0   0.4.2   0.4.4   0.5.1   0.6.0   1.0.0   1.0.2
0.3.0   0.4.1   0.4.3   0.5.0   0.5.2   0.6.1   1.0.1
~/libwebp% ls 1.0.1/
bin include lib share
~/libwebp% ls 1.0.1/bin/
cwebp   dwebp

実行

  • まとめて実行して計測
for n in `seq 1 100` ;
  do for v in ?.?.? ;
    do echo -n $v ; time $v/bin/cwebp IMG_0982.png -o $v.webp >& log ;
  done ; done >& log1-100.txt

集計

異常値を除外する為に、100回計測した値のうち、大きい方から25個、小さい方から25個削って、中央値付近の50個を残して平均をとりました。いわゆる trimmed mean です。

foreach ($timeTable as $version => $arr) {
    $arr = $timeTable[$version];
    sort($arr);
    $timeTable[$version] = array_slice($arr, 25, 50);  // trimming
}

$meanTable = [];
foreach ($timeTable as $version => $arr) {
    $total = 0;
    foreach ($arr as $v) {
        $total += 60.0 / $v;  // per minutes.
    }
    $meanTable[] = $total / count($arr);  // mean
}

グラフ

image.png

ファイル入出力や PNG デコードの時間が混ざって嵩上げされているので、純粋な WebPエンコードの速度はグラフの見た目よりも違いが大きい可能性があります。あと、本来は Error Bar をつけるべきですが今回は手抜きしてます。

image.png

備考

色々手抜きしてる点。

  • cwebp を使って PNG Decode と WebP Encode をごっちゃに測ってる
  • cwebp のデフォルトの設定なので、画質や利用シーンに応じた設定をした場合は多分話が別。
  • 処理毎に cwebp を起動し直してるので runtime 立ち上げコストも混ざってる
  • ストリーミング処理するならレイテンシーが大事だけど。それが分からない。
  • コンパイルする時にオプション次第でまた結果が変わると思います。特に最適化の指定もしてませんし。

グラフの様子

  • 0.2.0 はめっちゃ遅い
  • 0.3.0 で大分速くなってる ↑
  • 0.4.0 で少し遅くなってる ↓
  • 0.5 でもう一段階速くなってる ↑

結論

古いバージョン使ってる場合は、最新のを試すと良いのではないでしょうか。

その他

libwebp-6.0.0 で色劣化が減るオプションが追加されているので、それを理由にバージョンを上げるのも良いかもしれません。

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3