InfoQ

News

Oniguruma JavaポートがJRubyを速める

作者 Werner Schuster , 翻訳者 編集部 投稿日 2007年11月30日 午後11時55分

コミュニティ
Java,
Ruby
トピック
JRuby,
Ruby on Rails,
パフォーマンス&スケーラビリティ
タグ
JRuby,
言語特性
Ola Bini氏がOnigurumaのポートであるJoniがJRubyトランクに統合されたことを報告した(source)
なんという素晴らしい日だ!Joni(Oniguruma RegExpエンジンのMarchinの素晴らしいJavaポート)がJRubyトランクに統合されたのだ。現在それは大変上手くいっているように見えるよ。
JRubyチームのメンバーであるMarcin Mielczynski氏はOniguruma(サイト・英語) RegExのポートをJavaコードに移行する仕事を行った。OnigurumaはRuby 1.9.×.に含まれているRegExpエンジンである。

これは、JRubyとRegular Expression(Regex)間にあった永遠に終わらないように見えたお話の最後の部分に過ぎないかもしれない。初期のJRubyバージョンは RubyのRegeexesを実装するのにJava内蔵のRegex(Javas 1.4以降に含まれている)を使用していた。これはサードパーティのライブラリ、またはポートを要しないので一番シンプルなソリューションである一方、ま たそれはJRubyをそれに適応させないという問題ももたらした。JRubyはRuby1.8.x(かもしくは将来のバージョン)と互換性を保つことを目標としており、同じRegexeをサポートするのに必要なのである。Javaの実装は非互換となったが、それは部分的に、いくつかの表現を失敗させる要因となったアルゴリズムディテールのせいでもある。Ola氏はそのステップを解説した(source)
それを修復するために私達はJRegexを代わりに統合しました。それが1.0が一緒にリリースされたエンジンで、またそれは現在未だ使用されているエンジンなのです。その動作はなかなか良好で、またJavaエンジンにしては速いのです。でも十分には早くはありません。特に正確なストリングと欠点を素早く検索するサポートが無く、そのエンジンは私達がbyte[]-stringsをchar[]かもしくはStringに変換 することを要します。正確にはそれは最適ではありません。もう一つの問題は特にマルチバイトサポートにおけるMRIとの互換性であります。
これらの問題は全てJoniで解決されるように見える。もしくは解決されるだろう。Regexパフォーマンスは過去において重大な問題であったが(例: JRuby on RailsにおけるOracle Mixの構築からのレッスンを参照(英文記事)してほしい)、Joniはその助けにもなりそうだ。Charles Nutter氏は新しいコードを伴うREXMLパフォーマンスを調査した(source)
一連の基本的な最適化に目を通した後、私達が心配していたほとんどの重要な表現はJRegexと同じくらい、もしくはそれよりも良く機能していたので、Ola氏は過去二日間においてその会話を調べた。Marcin氏今後もはいろいろな最適化に取り組むのだが、Ola氏と私は両方とも新しいコードで遊んでいた。そしてその外観は素晴らしいものです。
そのリンクされている記事は、Joniコードで大幅な加速を見せた統合前と統合後のコードを比較したベンチマーク結果に続いている。

これらの課題はまた、たくさんのRuby実装の代案にも共通している。(ほとんどの場合)Rubyによって書かれたRuby実装であるRubiniusは、Onigurumaを含むというシンプルなソリューションを使用している。JVMかもしくは.NETのようなVMに基づいたRuby実装は、ネイティブライ ブラリを含んでいることがデプロイメントを更に困難にするという問題を抱えている。それだけではなく、Marcin氏がOla氏のブログ上のコメントで説明 しているように他にも統合に関する課題があるのだ(source)
私達はOnigurumaを含むことを既に考慮していました。それにはいくつかの理由があります。スレッディング: Onigurumaはコードレンジタブレットをイニシャライズする時か、もしくは共有ASTノード(Character Class発すテーブルのような)を管理する際にグローバルロックを使用します。Onigurumaバイトコードインタプリタも、またスレッドロックを使用しています(それは停止することもできますが、Java landで無償で手に入れることができ、外国のスレッドをjava oneと混合することはハッキングになるでしょう。)。例外: segfaultから回復するのは困難になるでしょう。OnigurumaのエラーをRubyの例外に変換したとしても、またそれは醜いハッキン グになってしまうでしょう。  
JNI: それはデータ分離を要すので、全てのストリング・バイトがコピーされる必要があるのです。
付加的なバイナリ分配: それを一つのメインフレームにコンパイルするのを頑張ってください:D
原文はこちらです:http://www.infoq.com/news/2007/11/oniguruma-joni-jruby
ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
slashdot+
Hatena

特集コンテンツ一覧

Flex 4の新機能トップ10

今週(2009年6月1日)AdobeはFlex 4の正式な初ベータ版をリリースしました。Flex 4はGumbo(オクラ)というコードネームで開発されています。今回のリリースには大きな変更が多数含まれています。このRIAフレームワークの最新バージョンにおいて変更された事柄についての概要を以下のリストで見ていきましょう。

Domain Driven Design(ドメイン駆動設計) Quickly 日本語版

ビジネス領域の深い理解を反映したドメインモデルを設計するための、ヴィジョンとアプローチです。この本は、Eric Evans氏の「Domain Driven Design」の主要点を短く読みやすく要約しました。

JavaプログラマがFlexとBlazeDSを学んだ方がいい13の理由

この記事ではJavaプログラマがなぜFlexとBlazeDSを学ぶべきなのかについて13の理由を述べています。なぜ高度にインタラクティブなWeb サイトからJavaで開発されたバックエンドをもつエンタープライズ・アプリケーションまでを含む、リッチ・インターネット・アプリケーション(RIA)の開発にFlexとBlazeDSの組み合わせが最適な選択肢となるのかについて述べています。

仮想パネル: バックログは重要な成果物とプラクティスか、それとも無駄か?

Mary Poppendieck氏、Ron Jeffries氏、Jeff Patton氏、David West氏、Steve Freeman氏、Jason Yip氏が、バックログに関する彼らの意見とアジャイルチームを成功させるために必要な事を語った。

Perf4Jを使ったパフォーマンス解析とモニタリング

この記事ではAlex Devine氏が、Java開発者がPerf4Jをどのように利用できるかと、タイミングステートメントにコードを追加し、ロギング、結果の解析とモニタリングを行うオープンソースツールセットの説明をします。

複雑な外部DSLを開発する

本稿では、Vaughn Vernon氏が内部DSLと外部DSLの違いを説明し、複雑な外部DSLを開発する際のステップを示します。

J2EEアプリケーションにおけるAOPを使ったフェッチ戦略の実装

この記事では低レベルのサービス・レイヤやリポジトリ・レイヤを肥大化させることなく、フェッチング・ストラテジによってモジュール化された方法でバックエンドにあるシステムからデータを取得する処理を最適化する方法について説明します。

実証済みのアイデアの融合: S#arp Architectureの裏側

この記事では、Web開発における多数の成熟傾向と、クライアントに価値を提供することに対するそれらのメリット、およびS#arp Architecture(最善の手法と技術を活用しようとするASP.NET MVCをベースとしたフレームワーク)内でのそれらの使用について取り上げます。