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割ファイルサイズが少ない
- メモリ
- ps で RSS サイズを見ると ImageMagick が最大5000位で mkthumb が7000位だった。けど、 RSS はプロセス実行中に膨らむので ps を打つタイミング次第で変わるし、あくまで参考まで。
- 実行ファイルのプロセスサイズの最大値を MacOS でうまく抽出する方法、ご存知の方、どうかご教示願います。
- ps で RSS サイズを見ると ImageMagick が最大5000位で mkthumb が7000位だった。けど、 RSS はプロセス実行中に膨らむので ps を打つタイミング次第で変わるし、あくまで参考まで。
- 画質
- まず両者の画像で差分の大きなピクセルを抽出
% 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
-
- https://github.com/yoya/misc/blob/master/php/bitmap_diff.php
- append オプションで横に連結した画像を作る。
% mkdir append % for i in `cd ~/Pictures/ ; ls *.jpg`; do convert convert/$i mkthumb/$i diff/$i +append append/$i; done
以下のように2つの画像と、更にそのピクセル差分の画像を並べたのを見比べます。
240x240に拡大して見ると四角枠の右側のシャープ差具合と色味が変わっている事が分かります。あくまでリサイズされた方が重要なので、80x80 を見なおして差が分からなければ問題ないと言えます。(想定する画素密度のうち一番粗いモニタで確認するのが前提)
評価の妥当性に全然自信がないのでツッコミを頂けると有り難いですし、似たような評価をしてる人がいたら比較させて頂けると幸いです。
libjpeg + swscale で作った go-thumber の mkthumb より ImageMagick が速いのは信じられないので。。(ImageMagick 信者だからこそ疑ってる)
追記 (2015/04/17)
使ってる jpeglib のバージョンを見たら go-thumber は HomeBrew で入れた 8.4 を元に自分がビルド、ImageMagick は MacPorts 側で(多分)9.1 をリンクしてそう。これって性能に関係するかな。。合わせないと。
追記 (2015/04/21)
disable-opencl, disable-openmp してない時は、ImageMagick の方が複数コア使ってる可能性があって公平じゃない事を思い出した。
-limit thread 1
MacBook Pro + MacPorts の ImageMagick (v6.9.0-6) で試したら結果が変わらないので良かったけど、Debian Linuxでは Real より User の方が秒数が大きくなるので複数コア使ってるはず。性能比較する時は注意。そもそも disable-openmp しないと負荷の高いサーバでは使い物にならないけど。