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+,
Hatena

No comments

返信

ジャンル別一覧

クラウドコンピューティング ~ EC2、Mosso、GoGrid

クラウドコンピューティングのプロバイダーであるEC2、Mosso、GoGridの新しいユーザーエクスペリエンスと、それぞれの機能の違いについて学びます。

仮想化入門

このArticleでは仮想化に関する利点と欠点を見ながら、仮想化の違いについて詳しく追っていきます。

Java 6のスレッド最適化は実際に動作しているのか? - パートII

パート2では、ベンチマークの結果を検証するために用いられるテクニックについてさらに深く見ていきたいと思います。最後に、「なぜプロセッサが異なるとロックのコストも大きく異なるのか」と言う真の疑問に答えます。

RESTアンチパターン

本稿では、Stefan Tilkov氏が「RESTful」な設計であると主張するアプリケーションに見受けられる最も一般的なアンチパターンのいくつかについて説明し、それらを避けるための方法を提案しています。

モデル駆動ソフトウェア開発のためのベストプラクティス

Sven Efftinge氏、Peter Friese氏とJan Köhnlein氏が、MDDを取り入れて成功した経験から、ベストプラクティスの解説を行います。

スケーラビリティの構築とパフォーマンスの達成:バーチャルパネル

Our panel of leading experts explores some of the challenges and thought processes that go into making their apps as scalable and performant as possible.

Spring 2.5:Spring MVCの新機能

この記事は、Spring 2.5で導入されたアノテーションを探究する3部作の第2弾です。Web層におけるアノテーションのサポートを扱います。最後の論文では、統合と検査で利用できる追加機能を説明する予定です。

"YUKATA"から始まるコミュニケーション(Agile2008 ライトニングトークより)

私は「浴衣」を着てパーティーに参加したことで、たくさん声を掛けていただけました。 そこで感じたことは、このカンファレンスが人との繋がりを生み出し、また言葉の壁を越えて積極的に交流する場所であることです。民族衣装はそれらを助けてくれるものでした。きっとこの交流が、新たなムーブメントをアジア圏の仲間たちにも与えてくれると確信しています。