ruby-trunk-changes r58905 - r58925

今日も erb や Time や Rational のメソッドの高速化/最適化などがありました。

k0kubun: r58905 2017-05-26 22:49:35 +0900

標準添付ライブラリ erb で動的に実行するスクリプトに文字列出力するコードを生成するところで String#-@ メソッドつまり単項演算子 - を文字列リテラルにつけることで dedup するようにしています。またこの効果を測るためのベンチマークスクリプトを追加しています。

svn: r58906 2017-05-26 22:49:36 +0900

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

k0kubun: r58907 2017-05-26 22:58:36 +0900

標準添付ライブラリ erb の rdoc 用コメントで、生成されるコードの例に r58905 の変更を反映させています。

k0kubun: r58908 2017-05-26 23:17:55 +0900

標準添付ライブラリ erb で文字列の連結に + を使っていたところを << で破壊的に追加するようにする最適化。

watson1978: r58909 2017-05-27 02:10:01 +0900

r58886 の String#concat の最適化と同様に Array#concat でも引数が1つだけの時に中間オブジェクトを生成しないようにする最適化を行なっています。 https://github.com/ruby/ruby/pull/1634

svn: r58910 2017-05-27 02:10:03 +0900

version.h の日付更新。

nobu: r58911 2017-05-27 02:11:15 +0900

Float#to_i の実装で FIXABLE() かどうかで分岐していましたが、dbl2ival() という関数で同じことをしていたのでそれを呼ぶようにリファクタリングしています。

nobu: r58912 2017-05-27 10:04:23 +0900

Dir.glob の base キーワード引数対応で fdopendir(3) の失敗時に fd leak していたのを修正しています。 [ruby-core:78767] [Feature #13056]

nobu: r58913 2017-05-27 10:26:31 +0900

絶対値の小さい数値で引数で桁数の指定があった時に Float#ceil や Float#floor が誤って 0 のほうに丸めてしまうことがある不具合を修正しています。 [ruby-core:81394] [Bug #13599]

ko1: r58914 2017-05-27 11:01:41 +0900

test/ruby/test_notimp.rb のテストで r58893 で導入した EnvUtil.apply_timeout_scale を使ってタイムアウト値に環境変数 RUBY_TEST_SUBPROCESS_TIMEOUT_SCALE の影響を加味するようにしています。

k0kubun: r58915 2017-05-27 11:47:11 +0900

r58905 で追加した erb のベンチマークスクリプトを benchmark/bm_app_erb_render.rb から benchmark/bm_erb_render.rb に改名しています。

k0kubun: r58916 2017-05-27 12:06:55 +0900

標準添付ライブラリ erb で動的に生成するスクリプトで文字列リテラル(freeze されている可能性がある)をコピーするのに dup メソッドを呼び出していたのを単項演算子メソッド String#+@ を使うように変更しています。freeze されていない時に余計なコピーを防ぐという違いがあるみたいです。なるほどー。

nobu: r58917 2017-05-27 12:14:04 +0900

.travis.yml で make の -j オプションに渡す並列に実行するジョブ数を 4固定からプロセッサ数を nproc コマンドで取得してそれを使うようにしています。

nobu: r58918 2017-05-27 12:43:02 +0900

本体にマージされた mspec で並列実行された場合に -fy で出力を YAML 形式にするオプションを自動で追加するようにしています。

normal: r58919 2017-05-27 13:35:41 +0900

common.mk で make test-all のターゲットの依存関係に exts を追加しています。 r58759 で削ったけどやっぱり r58762 で defs/gmake.mk で追加するように戻してたと思いますが、それじゃ不十分だったんでしょうか。

nobu: r58920 2017-05-27 14:18:52 +0900

r58919 の変更を受けてだと思いますが .travis.yml で make test-all 時に -o exts オプションを追加して拡張ライブラリのビルドを除外するようにしています。なるほど Travis CI のためだったのか。

watson1978: r58921 2017-05-27 14:41:00 +0900

Time#subsec や Time#round などの Time のメソッドで呼ばれる quov() でメソッド呼び出ししていたのを rational.c の numeric_quo() を rb_numeric_quo() にして static を消してこれを直接呼び出すようにして最適化しています。 https://github.com/ruby/ruby/pull/1601 [ruby-core:80915] [Bug #13519]

watson1978: r58922 2017-05-27 14:41:02 +0900

rational.c の i_gcd() で下位ビットが 0 の時のショートカット処理を追加することで高速化しています。おお、すごい。 https://github.com/ruby/ruby/pull/1596 [ruby-core:80843] [Bug #13503]

normal: r58923 2017-05-27 16:18:52 +0900

r58919 の test-all に exts の依存関係を追加したのを revert しています。

normal: r58924 2017-05-27 16:23:02 +0900

r58534 で修正した nogvl_wait_for_single_fd() のように IO.copy_stream の IO 待ちで busy wait になってないか確認するためのテストを追加しています。このために Benchmark を利用して CPU 使用率をチェックする assert_cpu_usage_low という assertion メソッドを追加しています。これまた確率的にこけそうな予感がするテストですな…。

normal: r58925 2017-05-27 17:26:47 +0900

rb_wait_for_sindle_fd() で rb_fdset_t に fd を登録する時に不正な fd (負の値)だったら 0 を返して空にするようにしています。不正な fd を渡すと Segmentation fault や NoMemoryError になってしまう可能性があるのでそれを避けるためとのこと。