javax.iamgeioが遅いのか
http://d.hatena.ne.jp/shokai/20100629/1277804347
の続き
前のコードではjavaのBufferdImageがRubyのオブジェクトに毎回変換されている気がしたので
int配列でwidth,heightだけを返すJava classを作ってJRubyのスクリプトから呼ぶ事にした。
Javaで配列で返せばRubyではtupleとして受け取れる。Mapで返せばHashで受け取れるので3値以上の場合はMapが良いかな
ImageSize.java
import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; public class ImageSize{ public static int[] getSize(String filename) throws Exception{ BufferedImage img = null; try{ img = ImageIO.read(new File(filename)); } catch(Exception e){ throw e; } int[] result = new int[2]; result[0] = img.getWidth(); result[1] = img.getHeight(); return result; } }
image_size.rb
#!/usr/bin/env jruby # -*- coding: utf-8 -*- require 'java' import 'ImageSize' p ARGV.size start = Time.now ARGV.each{|name| begin width, height = ImageSize.getSize(name) puts "#{name} => #{width}, #{height}" rescue puts "#{name} => error" end } puts Time.now-start
javac ImageSize.java jruby image_size.rb
まったく速くならなかった。