[株専][Java][Uruma][JRuby]JRubyを BSFで扱ってみる(その3)
JRubyもgemライブラリを使用して動作したので、次は、BSF経由で実行してみます。
以下のライブラリをビルドパスに追加します。
- jruby.jar
- bsf.jar
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); }
結果
→ http://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/ → http://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");