![]() |
JRuby - Java powered Ruby implementation |
Java仮想マシンで動作するRuby「JRuby」はJavaがもっているさまざまな利点を利用できる興味深いプロダクトだが、Javaの欠点もそのまま引き継いでいる。もっとも顕著なのは起動時間が遅いことだ。これはLinuxなどでは特に気になる。一度起動が完了しJITが有効になったあとのJRubyは優れた速度を出すが、起動は遅い。小さいツールを作って利用するようなケースはJRubyは苦手ということになり、「起動が遅い」という悪名高い評判を得ることになる。
JRubyの主要開発者であるCharles Nutter氏がHeadius: JRuby Startup Time TipsにおいてJRubyの起動を高速化するための7つのテクニックを紹介している。いくつかはJRubyに特有のものだが、それ以外はJavaで動作するアプリケーションに普遍的に適用できる内容になっている。紹介されている起動高速化テクニックは次のとおり。
OpenJDKおよびSun JDKはJITエンジンにHotSpotを実装している。HotSpotにはJITコンパイルが高速なかわりに最適化が浅い『client』モードと、長いパスとより多くのリソースを使うものの広範囲に渡って最適化を実施する『server』モードの2つが用意されている。起動時間を高速化するには『client』モードへの切り替えが有効。
従来のJDKはデフォルトで『client』モードを採用していたが、最近のJDKはデフォルトが『server』になっていることが多い。それに64ビットモードには『server』しか用意されていない。『server』モードで動作しているならオプションを指定して『client』モードに変えることで起動時間の大幅な短縮が可能。JRuby Startup Time Tipsに掲載されているRubyGemのブートとActiveSupportのロードという例では次のように起動時間が半分まで短縮されている。
| Java | jruby -e "require 'rubygems'; require 'active_support'" |
|---|---|
| JDK 1.6.0_17 64bit Server | 5.068 |
| JDK 1.6.0_17 32bit Client | 2.275 |
J2SE 5.0から共有アーカイブと呼ばれる起動高速化技術が用意されている。もともとAppleで採用された技術で、共有メモリにJavaクラスをまとめて読み込んでおくことで処理を高速化している。最近のMac OS XやWindowsではデフォルトで有効になっているため、これらOSでは起動速度が早い。
LinuxのようなOSではこの機能はデフォルトでは有効化されていないことがほとんどであるため、この機能を有効にすることで起動時間の短縮が可能になる。有効にするためのコマンド例は『sudo java -Xshare:dump』など。環境によっては-d32や-clientといったオプションも必要になる。
JRuby自身のJIT機能は、短い時間しか実行されないプログラムの場合には逆に速度を遅くする原因にもなる。このため、小さいプログラムの場合は『-X-C』を指定するなどしてJRuby JITをすべて無効にすることで起動時間が高速化できることもある。それほど劇的な向上にはならないが、積算されればそれなりの時間になる。
| Java | Time |
|---|---|
| jruby -S gem install rake | 13.188 |
| jruby -X-C -S gem install rake | 12.590 |
Rubyではクリーンな環境が欲しい場合など、#systemや#exec、またはバッククォートで括ることで処理をRubyのサブプロセスへ切り分けるテクニックがよく使われる。JRubyでは同テクニックが使われた場合でもパフォーマンスが落ちないように同じJVMプロセスに新しいJRubyインスタンスを生成して利用するといった工夫をしているが、それでもコストはかかる。また、対象にリダイレクトが含められている場合にはJRubyインスタンスの生成ではなく、新しくJVMプロセスを生成する必要がありとても大きな負荷になる。サブプロセスを生成するような処理は避けた方が起動時間を短縮できる。
なかなか難しいことだが、起動時に必要になる処理を減らすことで起動時間に短縮につなげることができる。
Nailgunライブラリを使う。Nailgunは複数の実行を単一のJVMで実行するためのライブラリで、小さいJRubyコマンドライン実行などが劇的に高速になるという特徴がある。ただし、RubyGemやRails、サブプロセスを生成するようなシーンではあまりその強みを発揮することができない。
JVMには多くのオプションが用意されており、それらは起動時間の短縮やまたその逆に効果を及ぼすものがある。特にヒープサイズやGCフラグのオプションには注意が必要。my favorite JVM flagsなどの記事を参考に調整するといい。なお、起動が高速になるパターンが見つかった場合にはJRuby開発者へ連絡してほしいと説明がある。またほかにもボトルネックを発見した場合にも連絡して欲しいと説明がある。
| JRuby 1.4.0登場 - Railsの最低限バージョン互換をクリア [2009/11/5] |
| RubyでAndroidアプリ開発、JRubyが意欲的 [2009/8/4] |
| SunのJRuby主要開発者がEngine Yardへ移籍 - 「次のステップに進むために」 [2009/7/29] |
| AndroidアプリをPython・Ruby・JavaScriptで開発する [2009/6/11] |
| JRuby 1.3、Java基本型配列へのアクセス10倍速く [2009/6/10] |
| JRuby 50倍速、MacRubyはすでに到達域 - 竹内関数 [2009/4/7] |
| Rails 2.3登場、デフォルト組み合わせの設定可能に [2009/3/17] |
| JavaアプリをAndroidに移植する方法 - JRubyの場合は1時間 [2009/3/3] |
MetaMoji、"知"の再利用を促進する機能モデリングツールを開発
【コラム】攻略! ツール・ド・プログラミング 第15回 HTML/CSS/DOMを書かないWebアプリケーションフレームワーク「qooxdoo」
| マイナビ、3月より書籍連動型のクリエイティブ・デザイン系セミナー開講 [12:00 2/10] |
| Linux Mint 12 KDE登場 [10:26 2/10] |
| Dell、重複排除により最大98%のデータ削減が可能なバックアップストレージを発売 [09:44 2/10] |
| 北大、「ポジトロン断層撮影法」による脳腫瘍の性質を診断する手法を開発 [09:40 2/10] |
| NICTなど、手術支援ロボット「da Vinci」の3D裸眼映像伝送実証実験を計画 [09:36 2/10] |
|
【レポート】CP+2012 - ユニークな技術とセンスで来場者をあっ!と驚かせる - カシオ [12:51 2/10] 家電 |
|
【2月10日】今朝のエンタメニュース放映時間ランキングTOP10 [12:47 2/10] エンタメ |
|
「ソウルイーター」クリアファイル付録、最新21巻は22日 [12:46 2/10] ホビー |
|
富士通の企業向けPC・ディスプレイが川崎市のCO2削減ブランドに選定 [12:43 2/10] パソコン |
|
小規模ゲームスタジオが1日で100万ドル獲得 - クラウドソース型調達で [12:37 2/10] ネット |