ruby-trunk-changes r47453 - r47479

今日は主にささださんが gc.c のリファクタリングや変数名/構造体メンバの変更および GC.stat のキーの変更で最適化とかをしていました。

normal: r47453 2014-09-09 04:38:22 +0900

rb_env_t の env メンバが別途メモリ領域を確保してポインタを保持するようにしていたのを、同じ構造体の末尾に可変領域を確保するようにして同一の領域に埋め込むようにしています。 r47447 で追加された lambda calculus を使った FizzBuzzベンチマークの改善のためだそうです。こんなにサクっと改善案を出してくるとはさすが normalperson さんです。 [ruby-core:64858]

svn: r47454 2014-09-09 04:38:34 +0900

version.h の日付更新。

normal: r47455 2014-09-09 05:51:57 +0900

const char * 型の C の文字列を pindown せずに ID 化する rb_intern_cstr_without_pindown() でテーブルから取得できた ID が Dynamic Symbol の ID だった時に dsymbol_check() を呼び出して LazySweep で回収予定の Symbol を参照してしまわないようにしています。 [Bug #10206] に関連した修正で、いくらか crash する確率を減らしてくれるけどまだ完全に直ってはいない、とこのと。

normal: r47456 2014-09-09 07:08:59 +0900

compile.c で new_insn_send() の引数 id の型が VALUE だったのを ID にして、不要な ID2SYM() と SYM2ID() の変換を削除しています。呼び元でもほとんど(というかたぶん全て) ID から Symbol に変換していたのに、関数中でも Symbol から ID に変換して使っていて無駄だったので省いています。 [ruby-core:64807] [misc #10207]

nobu: r47457 2014-09-09 09:02:08 +0900

標準添付ライブラリ mkmf.rb で pkgconfig --cflags の内容を $CXXFLAGS にも追加するようにしています。 [ruby-core:54532] [Bug #8315]

nobu: r47458 2014-09-09 09:27:34 +0900

標準添付ライブラリ mkmf で pkgconfig の --cflags-only-I や --cflags-only-other が使えたらそれを使って $INCFLAGS と cflags に分離してプリプロセッサ用のオプションを別に渡せるようにしています。

nobu: r47459 2014-09-09 09:31:21 +0900

template/fake.rb.in で "@srcdir@" を使っていたのを @abs_top_srcdir@ という変数(?)を利用するようにします。 r47287 の続きみたいですね。

ko1: r47460 2014-09-09 11:14:01 +0900

r47372 で追加した Object#dup でのメモリリークのテストのタイムアウトを長くしています。

ko1: r47461 2014-09-09 11:45:21 +0900

gc.c の rb_objspace_t の真偽値のフラグのメンバを bit field を使ってまとめてメモリ容量を削減しています。メモリ量というより(rb_objspace_t は1つしか存在しないと思いますし)キャッシュヒット率の改善のためだそうです。

nobu: r47462 2014-09-09 11:59:08 +0900

更に rb_objspace_t でメンバの順番の入れ替えでアライメントをそろえてサイズを削減しています。

ko1: r47463 2014-09-09 12:07:46 +0900

gc_sweep_rest() で誤って during_gc をインクリメントしていたのを修正。真偽値(bit field)なのに数値としてインクリメントしていたので、多分古いコードが残っていたのでしょうね(ネストするようになってた?)。

ko1: r47464 2014-09-09 12:13:25 +0900

Incremental GC の導入時に追加された enum gc_stat の定数の名称に gc_stat_ と prefix を追加して、遷移を gc_stat_transition() という関数で行うようにして、遷移前と遷移先が整合しているかチェックするようにしています。

ko1: r47465 2014-09-09 13:12:14 +0900

gc.c の ruby_disable_gc_stress という GC.stress を一時的に無効化するフラグを削除して、かわりに ruby_disable_gc というフラグを追加しています。 ruby_disable_gc_stress は SIGSEGV のハンドラで立ててそれ以降の GC.stress を無視させるようにしていたのですが、通ることが多い GC.stress の条件分岐の条件を減らして、そもそも SIGSEGV の後始末では GC を実行しないようにしてしまうようにしているようです。

ko1: r47466 2014-09-09 13:56:55 +0900

rb_objspace_t::flags::gc_stressfull という bit field フラグを追加して、gc_stress メンバは gc_stress_mode と改名して、両方をセットするようにしておいて、newobj_of() では bit field のほうを参照するようにしています。これもキャッシュ効率をよくして高速化のためだと思われます。どれくらい効くのかな…。

ko1: r47467 2014-09-09 14:12:15 +0900

さらに gc_stressfull の bitfield は during_gc の次に移動したり(連続するビットにあるとより効率的なコードが生成されるんでしょうか。同じバイト内に入ってるからあんまり変わらないんじゃないかという気がしますが…)、LIKELY()/UNLIKELY() マクロを使って条件分岐にヒントを追加したりと gc.c の細かな最適化を行なっています。

ko1: r47468 2014-09-09 14:24:42 +0900

さらに gc.c の構造体 rb_heap_t と rb_objspace_t のメンバの入れ替えで cache locality を改善しようとしているようです。主に newobj_of() で使うものをまとめるようにしているそうです。

ko1: r47469 2014-09-09 15:00:57 +0900

更に更に rb_objspace_t のメンバの順番を入れ替えています。

nobu: r47470 2014-09-09 15:39:08 +0900

r47464 で導入した gc_stat_transition() のマクロ名や定数名が typo していて、RGENGC_CHECK_MODE を有効にしてもチェックされていなかったのを修正しています。

ko1: r47471 2014-09-09 18:33:52 +0900

構造体 rb_objspace_t::heap_pages のメンバ名を改名したり(と、いうか used, length, limit, increment が allocated_pages, allocatable_pages, sorted_length になっていて1つ減っているのですがこれは…。limit が使われてなかったのかな)、それに対応して GC.stat のキーの名前も変更したりしています。 [ruby-core:63021] [Feature #9924]
ここに改名の履歴がありました https://docs.google.com/spreadsheets/d/11Ua4uBr6o0k-nORrZLEIIUkHJ9JRzRR0NyZfrhEEnc8/edit?pli=1#gid=0
..._slot -> ..._slots とかは正直どっちでもいいのであんまり変えて欲しくないような…(それか両方で取れるかようにしておくか)。まあ GC.stat の内容なんて実装の詳細に関係するので、全体としては変わってしまうのはしょうがないと思います。

ko1: r47472 2014-09-09 18:53:47 +0900

GC.stat のキーの Symbol 名を再修正。 r47471 の続きです。

ko1: r47473 2014-09-09 19:01:18 +0900

rb_objspace_t のメンバを total_allocated_object_num -> total_allocated_objects および total_allocated_object_num_at_gc_start -> total_allocated_objects_at_gc_start、total_freed_object_num -> total_freed_objects と改名、対応して GC.stat の返すキーの Symbol 名も変更しています。

ko1: r47474 2014-09-09 19:55:18 +0900

更に rb_objspace_t のメンバ marked_objects を marked_slots に改名して GC.stat の対応するキーも改名しています。

nobu: r47475 2014-09-09 20:22:23 +0900

r47473 での GC.stat のキー名の変更にテストを追随させています。

kazu: r47476 2014-09-09 21:50:18 +0900

r47465、r47467、r47468 の ChangeLog エントリの typo を修正しています。

kazu: r47477 2014-09-09 21:52:17 +0900

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

suke: r47478 2014-09-09 22:01:21 +0900

拡張ライブラリ win32ole のサンプルのコメントアウトされたコードの削除と、Excel の操作をする時に表示が目で確認しやすいように sleep を追加しています。グラフを操作しているみたいですね。

kazu: r47479 2014-09-09 22:09:14 +0900

r47466 と r47467 の ruby_gc_stressfull を ruby_gc_stressful に改名(typo 修正)しています。