small lightシリーズ
[1] ライブドアのsmalllightを使って動的に画像をリサイズしてみる
[2] いろいろsmalllightを使って動的に画像をリサイズしてみる
[3] smalllightでのエンジンの選択の仕方
[4] smalllightでのエンジンの選択の仕方 (ヒントオプション追加)
先日の記事を書いた時点では気づいていなかったのですがsmalllightはJPEGのリサイズを高速化するパラメータがありました。
ヒントオプションというものです。早速再度有効にしてとってみました。
テスト画像
JPEG 6400×4800(17.7MB) -> 640×480
オプション
ヒントオプションなし
dw=640,dh=480,cw=640,ch=480
ヒントオプションあり
dw=640,dh=480,cw=640,ch=480,jpeghint=y
imlib2(libjpeg)
X-SmallLight-Description transfer=1725ms, modify image=1279ms (load=1150ms, scale=112ms, save=16ms)
↓
X-SmallLight-Description transfer=1927ms, modify image=373ms (load=340ms, scale=13ms, save=19ms)
imageMagick(libjpeg)
X-SmallLight-Description transfer=1573ms, modify image=4265ms (load=1320ms, scale=2906ms, save=38ms)
↓
X-SmallLight-Description transfer=1225ms, modify image=4252ms (load=1318ms, scale=2897ms, save=36ms)
imageMagickが変わっていないですね・・・
なんでだろうと情報を漁っていたところImageMagickのバージョンが古いと使えないということがわかりました。
検証に利用しているマシンはCentOS5.3のためyumで入るimageMagickのバージョンは6.2.8と非常に古いです。
smalllightでjpeghintオプションを使う際に、imagemagickをコマンドでのconvertで相当するオプションは
-define jpeg:sizeですが実際に使えるか確認しました。
imageMagick6.2.8
[root@LIP-HAPP-01 ~]# time convert -resize 640x480 sbig.jpg na.jpg real 0m3.625s user 0m3.276s sys 0m0.344s [root@LIP-HAPP-01 ~]# time convert -define jpeg:size=640x480 -resize 640x480 sbig.jpg na.jpg real 0m3.619s user 0m3.324s sys 0m0.276s
はい、誤差レベルです。
そこで比較的新しい6.6.0を入れて確認してみました。
imageMagick6.6.0
[root@LIP-HAPP-01 ~]# time convert -resize 640x480 sbig.jpg na.jpg real 0m4.200s ← user 0m3.992s sys 0m0.196s [root@LIP-HAPP-01 ~]# time convert -define jpeg:size=640x480 -resize 640x480 sbig.jpg na.jpg real 0m0.488s ← user 0m0.432s sys 0m0.048s
サックリ10倍ぐらい速くなったことがわかると思います。
そこで再度smalllightで取り直してみました。
測定する際は、最初に5回アクセスしてその後の5回を取得しました。(単位はミリ秒)
imagemagickでlibjpegかつヒント無しを1とした場合に速度が何倍になったか
ヒントオプションが上手く効くと非常に高速なことがわかります。
ただしこれは常に有効に働くわけではなく画像サイズが半分以下になるときのみ有効なので注意が必要です。
詳しい条件については@mirakuiさんの「本当は速いImageMagick: サムネイル画像生成を10倍速くする方法」を参照してください。
しかし適用できない場合で指定していてもエラーにならないので常に指定しておいて問題ないかと思います。
ちなみに6.2.8->6.6.0
に変えただけだとパフォーマンスはちょっとだけ落ちるみたいです。
正直気にするレベルではないですが。
4000×4000の2.37MBのjpgを480×480にリサイズしたケースです。
imageMagick6.2.8(libjpeg-turbo)
X-SmallLight-Description transfer=224ms, modify image=1856ms (load=278ms, scale=1563ms, save=14ms)
X-SmallLight-Description transfer=228ms, modify image=1852ms (load=277ms, scale=1560ms, save=14ms)
imageMagick6.6.0(libjpeg-turbo)
X-SmallLight-Description transfer=204ms, modify image=1947ms (load=244ms, scale=1688ms, save=13ms)
X-SmallLight-Description transfer=202ms, modify image=1946ms (load=250ms, scale=1686ms, save=9ms)
あと6.2.8でmakeしたsmalllightは6.6.0に上げたときに使えなかったので
もう一回makeする必要があります。
手順的には特に変わりありません。make cleanを追加するぐらいです。
参考
本当は速いImageMagick: サムネイル画像生成を10倍速くする方法
本当はもっと速いImlib2: Imlib2でもImageMagickと同じ仕組みでサムネイル画像生成を速くする方法