exif_thumbnailを作った理由と実験
libthumbを作ったのは、『サムネイルの一覧を表示する際、Exifの全タグを読み込む必要はないのでは?』という単純な思いつきからでした。
アプリがネイティブであろうがウェブであろうが、サムネイルの一覧はできるだけ早く表示し、後でユーザがサムネイルをクリックしたら、その画像ファイルのExifのタグを改めて読み込めばいい。
また、libthumbのRuby拡張ライブラリ、exif_thumbnailを作ったのは、Ruby on RailsやSinatraなどでlibthumbを使いたかったからです。
そこで、exifrとexif_thumbnailをRubyのBenchmarkモジュールで比較してみました。
前提
- MacBook Air (13-inch, Mid 2012, Intel Core i7 2GHz, RAM 8GB, SSD 256GB)
- OS X 10.8.3
- ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin12.3.0]
- exifr (1.1.3)
- exif_thumbnail (0.0.1)
- FOOD.JPG, 1.2MB, 1536x2048, Apple iPhone 3GS(テスト画像)
ソース
第一引数で指定したExifファイルからサムネイルを取り出し、それを第二引数で指定したファイル名で保存するプログラムです。test.rbとして保存し、実行しました。
require 'benchmark' require 'exifr' require 'exif_thumbnail' def use_exifr File.binwrite(ARGV[1], EXIFR::JPEG.new(ARGV[0]).thumbnail); end def use_exif_thumbnail File.binwrite(ARGV[1], EXIFThumbnail.read(ARGV[0]).data) end n = 1000 Benchmark.bm(17) do |x| x.report("exifr : ") { for i in 1..n; use_exifr; end } x.report("exif_thumbnail : ") { for i in 1..n; use_exif_thumbnail; end } end
結果
$ ruby test.rb /Users/nkmrshn/Pictures/FOOD.JPG /Users/nkmrshn/Desktop/Thumbnail.jpg user system total real exifr : 1.040000 0.080000 1.120000 ( 1.116702) exif_thumbnail : 0.030000 0.080000 0.110000 ( 0.163770)
考察
systemは変わらないのに、userを見るとexifrの方が遅いです。これは、Exifのタグをexifrは全て読み込んでいるのが原因かは、このテストではわかりません。しかし、サムネイルだけ*1を取得したい場合は、exif_thumbnailの方が早いことがわかりました。
余談
これは、愚考だ。そもそも、サムネイルが必要なら画像ファイルをサーバなどに保存する時点で、サムネイルを抽出・保存しておけばいいだけの話ではないか。
*1:サムネイル(data)以外にサムネイルサイズ(length)と回転方向(orientation)も取得しています。