ruby-trunk-changes r43541 - r43558

今日は Psych の不具合修正、Array のメソッドのいくつかの RGenGC での Shady 化を防ぐ変更、GC のパラメータ調整などがありました。

tenderlove:r43541 2013-11-06 04:15:40 +0900

拡張ライブラリ psych で DateTime などを dump したものを load しようとするとタグの参照でエラーになる不具合を修正しています。 https://github.com/tenderlove/psych/issues/168

svn:r43542 2013-11-06 04:15:46 +0900

version.h の日付更新。

ko1:r43543 2013-11-06 07:13:08 +0900

benchmark/gc/gcbench.rb でプロファイル情報の出力を抑制するオプションを追加しています。でも GC.stat の出力は常に有効なんですね。

ko1:r43544 2013-11-06 07:13:51 +0900

GC のプロファイラや制御パラメータ、モードなどが増えてきたので GC::OPTS という定数を追加して配列に各パラメータを格納するようにしています。 うーむ Array より Hash にしたほうが可読性がよさそうですね。あと freeze しておいたほうが。

eregon:r43545 2013-11-06 07:27:27 +0900

r43543 で変更した benchmark/gc/gcbench.rb の typo を修正しています。

ko1:r43546 2013-11-06 09:14:26 +0900

r43532 で導入した RGENGC_ESTIMATE_OLDSPACE マクロが未定義の時は(USE_RGENGC が 0 の時) 0 に定義するようにしています。 GC::OPTS に格納するために未定義だとコンパイルエラーになるのでそれを避けるためだと思われます。

ko1:r43547 2013-11-06 09:17:14 +0900

いくつかベンリマークスクリプトを benchmark/ に追加しています。主に RGenGC(特に 3世代バージョンを考慮)の時の GC の性能計測のためのものみたいですが、ひとつ Thread と Queue の生産者/消費者モデルのベンチマークスクリプトもあります。コミットログによると拡張ライブラリ版の Queue の性能を計測するためだそうです。

nobu:r43548 2013-11-06 09:21:05 +0900

r43547 で新規追加されたファイルの svn property 設定。

glass:r43549 2013-11-06 10:39:55 +0900

Array#& メソッドで引数の Array が空の時に空配列を返すショートカット処理を少し早めて中間データの Hash を生成する前に返すようにしています。また Hash から rb_hash_tbl_raw() で st_table を取り出すのを1回だけ実施してローカル変数に格納して使いまわすようにしています。また配列の要素を取り出すのに rb_ary_elt() から RARRAY_AREF() を使うようにするなど細かな無駄な処理を省くようにしています。
戻り値用の Array の capa をあらかじめ self か引数の Array の大きいほうにあわせて初期化していたのがヒープを使わない初期化に変更されていますが、これはどんなもんでしょうねぇ。使いかたによりけりで & で空や少ない要素数になることが期待される使いかただとこのほうが速いでしょうし、大量の要素をもつ Array 同士の & で結果も大きめになる場合は従来のほうが……って書いてて前者のほうがありがちな気がしてきました。どうなんでしょう。

glass:r43550 2013-11-06 11:50:28 +0900

Array#sample の実装で RARRAY_PTR() を使っていて配列が Shady になっていたところを RARRAY_AREF() と RARRAY_PTR_USE() を使うようにしています。前半で rb_ary_elt() を呼んでいるところは RARRAY_AREF() ではいけないのかな、と一瞬思いましたがこの前の RAND_UPTO() で Ruby の処理が呼ばれる可能性があるので配列サイズが変化してしまっている可能性があるので再度インデックスがサイズの範囲内に収まっているかのチェックが必要なんですね。また rb_ary_new{2,3,4} などの番号の関数名を意味のある関数名の別名のほうを利用するようにリファクタリングしています。

naruse:r43551 2013-11-06 15:23:27 +0900

lib/rubygems/specifications.rb で未定義のインスタンス変数の参照の警告を抑制するために defined? でのチェックを追加しています。

naruse:r43552 2013-11-06 15:23:29 +0900

RubyGems の警告除去続き。 File.exists? を利用しているところがあったのですが r43377 あたりで deprecated として警告を出すようにしたので File.exist? を利用するように書き換えています。

naruse:r43553 2013-11-06 15:25:18 +0900

OpenStruct のテストで assert_match の第一引数に正規表現リテラルを渡しているところで警告が出ていたのを抑制するためにメソッド呼び出しにかっこをつけています。

duerst:r43554 2013-11-06 16:32:56 +0900

標準添付ライブラリ open3.rb の rdoc コメントの文法の修正など。

tarui:r43555 2013-11-06 19:32:40 +0900

make help で表示するターゲット名に gcbench と gcbench-rdoc の説明を追加しています。

glass:r43556 2013-11-06 21:09:31 +0900

Array#reverse の実装でも RARRAY_PTR() を使っていたところを RARRAY_PTR_USE() を使うように変更しています。
今度は配列サイズを最初に取得しているのですが、rb_ary_modify() から巡り巡って ALLOC_N() が呼ばれる可能性があり、ここで GC が走る可能性があるので、そのあたりでスレッドの切り替えや TracePoint のイベントフックなどで Ruby の処理が実行される可能性があって配列サイズが変化できると思うので rb_ary_modify() の後に RARRAY_LEN() するほうがいいのではないかと思います。

glass:r43557 2013-11-06 21:20:39 +0900

Array#shift の実装でも RARRAY_PTR() を使っていたところを RARRAY_PTR_USE() を使って書き換えています。

tarui:r43558 2013-11-06 21:36:34 +0900

GCmalloc 由来の実行を制御する malloc_limit のしきい値パラメータの更新方法やデフォルトのパラメータを変更して、2.0.0 に近いメモリ使用量に抑制するようにしているそうです。あとは定数の定義のコメントの入れかたなどの変更。