ruby-trunk-changes r54135 - r54158

今日は整数の配列への inject(:+) の最適化を Bignum まで範囲を広げたり、Array#min, #max や時に配列リテラルに対して min, max を呼び出している時に配列オブジェクトの生成を抑制する最適化の導入などがありました。

mrkn: r54135 2016-03-17 00:53:08 +0900

test/ruby/test_bignum.rb で Bignum を使ったテストをするために充分大きな整数を固定のビット幅で作って使っていましたが、テストクラスの先頭で Fixnum と Bignum の境界を実際に探ってその数値を定数に格納しておいてこれを使うようにしています。またこのビット幅やいくつか定数を追加しています。

drbrain: r54136 2016-03-17 07:18:12 +0900

Marshal.load で不正なオブジェクトの参照(link)が読み込まれた時に SEGV せずに ArgumentError 例外を発生させるように修正しています。

odaira: r54137 2016-03-17 08:20:14 +0900

Time#gmtoff のテストが DST (daylight-saving time いわゆるサマータイム)が絡む時は比較する両方で DST の有無が同じでないとチェックが失敗するので一致しない時はこの assertion をスキップするようにしています。

nobu: r54138 2016-03-17 10:23:03 +0900

r54136 で追加したテストを assert_raise_with_message を使って例外メッセージもチェックするようにしています。

nobu: r54139 2016-03-17 11:36:28 +0900

拡張ライブラリ socket で inspect_tcpi_msec() という関数を定義する条件をプラットフォームでざっくりと分けてたのを、必要な構造体メンバの存在チェックをするようにしてより精密にしています。条件の最後の 0 は項目が増えた時に最後のカンマを増やさなくてもいいようにするための無意味な末尾役ですかね。 [ruby-core:74388] [Bug #12185]

duerst: r54140 2016-03-17 12:09:00 +0900

r54112 で追加した enc/unicode.c のマクロ OnigSpecialIndexMask() と I() の不具合と実装漏れの修正。

nobu: r54141 2016-03-17 13:31:10 +0900

末尾再帰最適化のオプションを有効にした時の VM 命令列へのコンパイラのテストを、末尾最適化を有効にしてコンパイルするヘルパーメソッドを追加してこれを利用するようにリファクタリングしています。

nobu: r54142 2016-03-17 14:22:57 +0900

テスト用のライブラリの assert_nothing_raised がブロックの値を返すようにしています。

nobu: r54143 2016-03-17 14:47:44 +0900

compile.c の構造体 LABEL のメンバー set を bit field にしています。1つだけ bit field にしてサイズは減るのかな。

naruse: r54144 2016-03-17 15:01:11 +0900

Windows 環境では SecureRandom.gen_random が利用している OpenSSL の RAND_bytes はブロックする可能性があるので、Random.raw_seed を利用する実装のほうを有効にするようにしています。 [ruby-core:74105] [Bug #12139]

nobu: r54145 2016-03-17 17:14:53 +0900

gc.c でプロファイル用に使っている tick_t という型を、powerpc64 アーキテクチャでの tick_t 型の定義に unsigned long long を利用するように条件コンパイルの分岐を増やしています。 大きいサイズが使えたほうがわずかながらパフォーマンスが良いみたいですね。 https://github.com/ruby/ruby/pull/1291

nobu: r54146 2016-03-17 17:20:29 +0900

Queue クラスの rdoc 用コメントに説明を追記しています。 https://github.com/ruby/ruby/pull/1292

akr: r54147 2016-03-17 18:50:19 +0900

先日の r54120 での Enumerable#inject で Fixnum の配列に対する inject(:+) の時の最適化を、今度は Bignum になっても有効なようにメソッド呼び出しを省いて直接処理するパスを追加しています。

akr: r54148 2016-03-17 20:55:58 +0900

r54120 および r54147 の Enumerable#inject の特定条件下での最適化されたパスを別の関数に切り出すリファクタリング

mame: r54149 2016-03-17 21:03:48 +0900

ちょっとよく憶えてないのですが Array#sort や Enumerable#min, #max などの最適化パスで利用する opt_method と opt_inited というメンバを切り出した構造体 struct cmp_opt_data というのを導入して、これを構造体内に埋め込むようにリファクタリングしています。

mame: r54150 2016-03-17 21:14:21 +0900

Array#min, Array#max を追加して可能なら比較のメソッド呼び出しを抑制して最適化しています。 [ruby-core:74297] [Feature #12172]

mame: r54151 2016-03-17 21:25:40 +0900

r54150 の Array#min, #max の最適化でブロックつきの時の処理を Enumerable のメソッドに委譲していたのを Array 版の実装内で処理するようにしています。 [ruby-core:74297] [Feature #12172]

mame: r54152 2016-03-17 21:37:20 +0900

r54150, r54151 のさらに続きで、Array#min, #max で super で Enumerable のメソッドに委譲しているところも enum.c の nmin_run() を rb_nmin_run() と改名して直接呼び出すようにしています。[ruby-core:74297] [Feature #12172]

mame: r54153 2016-03-17 21:47:31 +0900

今度はさらに [a, b].min や [a, b].max のように配列のリテラルに min, max が呼ばれているような時に opt_newarray_max と opt_newarray_min という最適化命令を追加して、メソッドの再定義などがない場合は直接比較して、中間データの配列の生成を抑制するような最適化を施しています。 [ruby-core:74297] [Feature #12172]

mame: r54154 2016-03-17 21:49:19 +0900

NEWS ファイルに r50150 から r50153 の Array#min, #max の最適化や、配列リテラルに直接 #min, #max を呼んでいる時の最適化について追記しています。 [ruby-core:74297] [Feature #12172]

mame: r54155 2016-03-17 21:52:47 +0900

Array#min, #max と Enumerable#min, #max の rdoc 用コメントのサンプルのコーディングスタイルの統一。

nobu: r54156 2016-03-17 22:08:35 +0900

r54153 で追加した opt_newarray_max および opt_newarray_min を使った配列リテラルに直接 max/min を呼んでいる時の最適化命令を使うコンパイル時の最適化処理を iseq_specialized_instruction() 関数に移動しています。 [ruby-core:74297] [Feature #12172]

nobu: r54157 2016-03-17 22:19:02 +0900

r54153 の #min, #max の最適化命令を使う時の条件に newarray 命令の次に LABEL などの余計なノードが入ってないことをチェックするようにしています。 [ruby-core:74297] [Feature #12172]

nobu: r54158 2016-03-17 22:21:36 +0900

コンパイラの最適化で GC のマーク漏れがおこらないように保護するためのマクロ RB_GC_GUARD() の定義で使っていた RB_GC_GUARD_PTR() というマクロ定義は削除して、RB_GC_GUARD() の定義に直接展開しておくようにしています。 https://github.com/ruby/ruby/pull/1293