ruby-trunk-changes r49983 - r49989

今日は Dir.glob の処理のリファクタリングや Write Barrier 処理の最適化など内部的な変更がありました。

nobu: r49983 2015-03-17 17:23:14 +0900

glob_helper() の引数 exist と isdir の情報をまとめて rb_pathtype_t という型を導入して struct dirent::d_dtype の値で判定するようにしています。 Linux では一部のファイルシステムで d_dtype が DT_UNKNOWN になるそうで、再帰的処理をするかどうかの判定時には DT_UNKNOWN もディレクトリである場合と同じ判定をするようにしています。

svn: r49984 2015-03-17 17:23:26 +0900

version.h の日付更新。

ko1: r49985 2015-03-17 18:57:47 +0900

GC の WriteBarrier の性能への影響をみるための benchmark で 2.2 からは 3回 GC を生き伸びたオブジェクトが promoted object になるので、それを考慮して promoted 版の benchmark スクリプトを追加しています。

svn: r49986 2015-03-17 18:58:08 +0900

r49985 で新規追加したファイルの svn property 設定。

ko1: r49987 2015-03-17 19:26:39 +0900

GC 用の WriteBarrier の実装が RGenGC 用の rb_gc_writebarrier_generational() とインクリメンタルGC 用の rb_gc_writebarrier_incremental() に分かれていて rb_obj_written() では rb_gc_writebarrier_incremental() をまず呼んで偽が帰ってきたらオブジェクトの世代チェックをして rb_gc_writebarrier_generational() を呼ぶという処理をしていたのを、rb_gc_writebarrier() という関数を導入して gc_writebarrier_incremental() での条件分岐をここに追い出して先に分岐するようにしています。また rb_gc_writebarrier_incremental() や rb_gc_writebarrier_generational() は NOINLINE() を使って inline 展開されるのを防いで rb_gc_writebarrier() が軽量になるようにしています(コメントによるとレジスタ退避操作を減らすためとのことで、ここは頻繁に呼ばれるところなので軽量にして本当にインクリメンタルGC用の WriteBarrier が必要な時だけ rb_gc_writebarrier_incremental() を呼ぶようにするという最適化みたいです。先に r49985 で追加したベンチマークで 2.2 以降 WriteBarrier 処理が重くなっていたのを改善しているようです。

nagachika: r49988 2015-03-18 00:21:47 +0900

r49987 の ChangeLog エントリの typo 修正。

svn: r49989 2015-03-18 00:22:05 +0900

version.h の日付更新。