BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース バグを残さずにストーリーを完成させるには

バグを残さずにストーリーを完成させるには

ブックマーク

原文(投稿日:2010/12/26)へのリンク

Ruby仮想マシンは着実に改善され続けており、ここ数週間でまとまった数の新リリースが行われた。

Rubinius 1.2がリリースされ、メモリ効率とデバッグにおける改善が行われた。Evan Phoenix氏はオブジェクト単位のメモリ利用量などRubinius 1.2で行われた変更の詳細について説明した。

[..]私たちはオブジェクト毎のメモリ利用の改善に焦点をフォーカスしました。とりわけ、オブジェクトがメモリ上にどのようにそのインスタンス変数を保持するかについてです。Rubyはインスタンス変数の宣言を必要としないので、モデルインスタンス変数のもっともシンプルな実装方法はハッシュです。これはまさにRubiniusがかつて行っていたことです。問題はインスタンス変数の数が少ないクラスに対して生じます。このような場合、ハッシュテーブルのサイズはかなりのものになり、1ワード(4バイトまたは8バイト)を保持するためだけに100バイト以上のメモリが必要になるのです![..]

新しいコードはクラスについての容易に観察可能な仮定にもとづいています。それは、クラスはそのインスタンスが生成されるより前にそのメソッドの大多数(普通はすべて)が定義される、ということです。私たちはこのことをうまく利用して、クラスのインスタンスが初めて生成される際にこのクラスのインスタンスが利用可能な全メソッドをチェックするコードを実行するようにしています。全メソッドというのは、そのクラス自体に定義されたもの、そのスーパークラスで定義されたもの、すべてのミックスインモジュールで定義されたものの全体を意味します。チェックした全メソッドから、それらのメソッドが利用するすべてのインスタンス変数のテーブルを構築します。

このことによって、私たちはこのクラスのインスタンスに対してどのようにメモリをレイアウトすべきかについてのよい絵柄を構築することができ、インスタンス変数をハッシュテーブルを必要とせずにメモリ上に保持することが可能になります。通常、メモリ利用量は64bitマシン上で100バイトから8バイトまでになります。

Rubiniusはこれまでも強力なDebugger APIを持っていたが、Rubinius 1.2ではruby-debugサポートを追加した。メモリ利用量やメモリリークをデバッグすることはヒープダンプ機能によってサポートされるものであるが、これをRubinius::VM.dump_heap("/path/to/file")のように利用することができる。ヒープダンプを作成する別の方法はまた別の有用なRubiniusの機能Query Agentを利用する方法である。これはモニタリングツールがRubiniusの情報にアクセスしたり、決まったアクションを起こさせたりすることを可能にする。

MacRuby 0.8も利用可能であり、このバージョンの主目的は安定性と互換性の改善である。現在MacRubyプロジェクトは1.0のリリースにフォーカスしようとしている。

私たちは今後これまでよりずっと頻繁にリリースをするようにするつもりである。そのため、ユーザがMacRubyをこれまでよりずっと頻繁にテストすること、そして、より多くのバグを報告してくれることを望んでいる。
しかし、私たちは重要な機能を導入するためのさらなるリリースを考えてはいない。今は安定性と互換性の課題にフォーカスしているからである。

最後に、新旧2つのMRIのパッチレベルリリースもちょうど行われた。MRI 1.8.7 p3301.9.2リリース以来最初のアップデートとなる1.9.2 p136である。

この記事に星をつける

おすすめ度
スタイル

BT