yoyaのメモ

2015/04/16(Thu) ImageMagick と go-thumber(swscale)のリサイズ性能比較

ImageMagick と go-thumber(swscale)のリサイズ性能比較

go-thumber(https://github.com/pixiv/go-thumber) にコマンドラインで画像変換する main ルーチン(mkthumb)が含まれていたので、それを使って ImageMagick と性能を比較してみました。(つまりネットワークを使わない、画像ファイル変換処理のみの比較)

検証環境

動作環境は MacBookPro 13inch 2014 mid モデルの SSD つき。

ImageMagick(v6.9.0-6) は MacPorts から。libjpeg と swscale ライブラリ(ffmpegに含まれる)は HomeBrew で入れてます。

尚、この評価用に集めた 487枚のイラストJPEG画像(縦横サイズは大体1000x1000位)をアスペクト比無視で 80x80 に縮小リサイズしました。

ImageMagick の convert で変換

% mkdir convert
% time for i in `cd ~/Pictures/ ; ls *.jpg`;
do convert -define jpeg:size=80x80 -resize 80x80! jpg:$HOME/Pictures/$i -quality 95 convert/$i ;
done

real    0m6.414s
user    0m4.039s
sys    0m1.596s
% cat convert/*.jpg > convert.cat
% ls -l convert.cat
-rw-r--r--  1 yoya  staff  3116250  4 17 02:50 convert.cat

ちなみに jpeg size hint を付けないと超遅いです。

% time for i in `cd ~/Pictures/ ; ls *.jpg`;
do convert -resize 80x80! jpg:$HOME/Pictures/$i -quality 95 convert/$i ;
done

real    0m32.530s
user    0m27.810s
sys    0m3.553s

go-thumber の mkthumb で変換

% mkdir mkthumb
% time for i in `cd ~/Pictures/ ; ls *.jpg`;
do mkthumb -a -w=80 -h=80 $HOME/Pictures/$i mkthumb/$i ;
done

real    0m8.350s
user    0m5.278s
sys    0m2.770s

% cat mkthumb/*.jpg > mkthumb.cat
% ls -l  mkthumb.cat
-rw-r--r--  1 yoya  staff  3431499  4 17 01:53 mkthumb.cat

比較

  • CPU
    • convert(6.414 s):mkthumb(8.350 s) = 0.768:1.000
    • ImageMagick の方が2,3割処理時間が少ない
  • ファイルサイズ
    • convert(3116250 bytes):mkthumb(3431499 bytes) = 0.908:1.000
    • ImageMagick の方が1割ファイルサイズが少ない
  • メモリ
    • psRSS サイズを見ると ImageMagick が最大5000位で mkthumb が7000位だった。けど、 RSSプロセス実行中に膨らむので ps を打つタイミング次第で変わるし、あくまで参考まで。
      • 実行ファイルのプロセスサイズの最大値を MacOS でうまく抽出する方法、ご存知の方、どうかご教示願います。
  • 画質
    • まず両者の画像で差分の大きなピクセルを抽出
% mkdir diff
% for i in `cd ~/Pictures/ ; ls *.jpg`;
do /usr/local/bin/php ~/git/misc/php/bitmap_diff.php convert/$i mkthumb/$i diff/$i ; done
% mkdir append
% for i in `cd ~/Pictures/ ; ls *.jpg`;
do convert convert/$i mkthumb/$i diff/$i +append append/$i; done

以下のように2つの画像と、更にそのピクセル差分の画像を並べたのを見比べます。

f:id:yoya:20150417031058j:image

分かりにくいので1辺あたり3倍に拡大してみましょう。

f:id:yoya:20150417031348p:image

240x240に拡大して見ると四角枠の右側のシャープ差具合と色味が変わっている事が分かります。あくまでリサイズされた方が重要なので、80x80 を見なおして差が分からなければ問題ないと言えます。(想定する画素密度のうち一番粗いモニタで確認するのが前提)

評価の妥当性に全然自信がないのでツッコミを頂けると有り難いですし、似たような評価をしてる人がいたら比較させて頂けると幸いです。

libjpeg + swscale で作った go-thumber の mkthumb より ImageMagick が速いのは信じられないので。。(ImageMagick 信者だからこそ疑ってる)

追記 (2015/04/17)

使ってる jpeglib のバージョンを見たら go-thumber は HomeBrew で入れた 8.4 を元に自分がビルドImageMagickMacPorts 側で(多分)9.1 をリンクしてそう。これって性能に関係するかな。。合わせないと。

追記 (2015/04/21)

disable-opencl, disable-openmp してない時は、ImageMagick の方が複数コア使ってる可能性があって公平じゃない事を思い出した。

-limit thread 1

MacBook Pro + MacPortsImageMagick (v6.9.0-6) で試したら結果が変わらないので良かったけど、Debian Linuxでは Real より User の方が秒数が大きくなるので複数コア使ってるはず。性能比較する時は注意。そもそも disable-openmp しないと負荷の高いサーバでは使い物にならないけど。