exif_thumbnailを作った理由と実験

libthumbを作ったのは、『サムネイルの一覧を表示する際、Exifの全タグを読み込む必要はないのでは?』という単純な思いつきからでした。

アプリがネイティブであろうがウェブであろうが、サムネイルの一覧はできるだけ早く表示し、後でユーザがサムネイルをクリックしたら、その画像ファイルのExifのタグを改めて読み込めばいい。

また、libthumbのRuby拡張ライブラリ、exif_thumbnailを作ったのは、Ruby on RailsSinatraなどでlibthumbを使いたかったからです。

そこで、exifrexif_thumbnailをRubyBenchmarkモジュールで比較してみました。

前提

ソース

第一引数で指定した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)も取得しています。