[株専][Java][Uruma][JRuby]JRubyを BSFで扱ってみる(その3)

JRubyもgemライブラリを使用して動作したので、次は、BSF経由で実行してみます。

以下のライブラリをビルドパスに追加します。

BSF利用コード

ポイントは、JRUBY_HOMEとJRUBY_LIBをSystemプロパティに登録すること。
登録しない場合、gemライブラリなどが見つかりません。

private static final String SCRIPT_ENGINE = "org.jruby.javasupport.bsf.JRubyEngine";

private static final String JRUBY = "jruby";

private static final String FILE_NAME = "(java)";

private static final int START_LINE = 1;

private static final int START_COLUMN = 1;

public static void main(String[] args) {

     System.setProperty("jruby.home", JRUBY_HOME);
     System.setProperty("jruby.lib", JRUBY_LIB);

     BSFManager.registerScriptingEngine(JRUBY, SCRIPT_ENGINE, new String[] { "rb" });

     String script = "require 'rubygems'\n" + "require 'hpricot'\n"
	+ "require 'open-uri'\n"
	+ "doc = Hpricot( open(\"http://www.kmc.gr.jp/\").read )\n"
	+ "(doc/:a).each do |link|\n"
	+ "  puts \"#{link.inner_html} → #{link[:href]}\"\n" + "end";

     manager.eval(JRUBY, FILE_NAME, START_LINE, START_COLUMN, script);
}

結果

KMChttp://www.kmc.gr.jp/
Top → http://www.kmc.gr.jp
Guidance → guidance.html
Project → project.html
Event → event.html
Members → members.html
Link → link.html
SitePolicy → misc.html
部員専用ページへ → https://www.kmc.gr.jp/
京大マイコンクラブ公式WEBhttp://www.kmc.gr.jp/
・・・

今度は文字化けしていないですね。


ただ、遅いんですよ。orz

再計測

スクリプトを以下に変更し計測しました。

script = "$out.println 'hello jruby!!'";

初期化処理は250ms で、eval処理はなんと 4141ms !!
hello jruby!!の出力だけなのでおそらくJRubyインスタンス化のオーバーヘッドでは??

と思い、以下のように複数回実行。

TimeWatchUtil.start("jruby2");
manager.eval(JRUBY, FILE_NAME, START_LINE, START_COLUMN, script);
long end = TimeWatchUtil.end("jruby2");
System.out.println(end + "ms");

TimeWatchUtil.start("jruby2");
manager.eval(JRUBY, FILE_NAME, START_LINE, START_COLUMN, script);
end = TimeWatchUtil.end("jruby2");
System.out.println(end + "ms");

TimeWatchUtil.start("jruby2");
manager.eval(JRUBY, FILE_NAME, START_LINE, START_COLUMN, script);
end = TimeWatchUtil.end("jruby2");
System.out.println(end + "ms");

TimeWatchUtil.start("jruby2");
manager.eval(JRUBY, FILE_NAME, START_LINE, START_COLUMN, script);
end = TimeWatchUtil.end("jruby2");
System.out.println(end + "ms");

結果

実行すると、以下のように取得できました。

初期化
250ms
hello jruby!!
4328ms
hello jruby!!
16ms
hello jruby!!
16ms
hello jruby!!
0ms

おぉ、一回目のevalのみ遅い!!

総論

gemのライブラリを含め、rubyjavaから扱えるようになりました。
スクレイピングやテンプレートエンジンとして利用すると便利そうです。
一回目のevalは遅いが2回目以降は十分に早いのでパフォーマンスも大丈夫でしょう。