ruby-trunk-changes r54975 - r54989

今日はインスタンス変数のアクセスの高速化がありました。かなり効果的みたいですね。

nobu: r54975 2016-05-11 21:24:16 +0900

minitest のテストで rand の実装によって(maglev の場合結果が違うらしい)結果を変えていたのを、rand が返す値を再定義して固定してしまって結果が同じ順番になるようにしています。

tarui: r54976 2016-05-11 21:50:38 +0900

struct iseq_compile_data に ivar_cache_table というメンバを追加して、インスタンス変数のアクセスはスコープ内で(この範囲ってどの単位になるんだろ?)同じインスタンス変数にアクセスする場合同じキャッシュを参照するようにしています。これまではインスタンス変数の参照/代入はそれぞれの場所で別の inline cache storage を使っていたんですね。 [ruby-core:74899] [Bug #12274]

tarui: r54977 2016-05-12 00:04:27 +0900

vm_getivar() で LIKELY()/UNLIKELY() をつけて fast-path を明示的に指定してコンパイラの最適化を促しているようです。 以前はコンパイラは賢いので人間が LIKELY()/UNLIKELY() つけるよりまかせたほうが良いみたいな話もありましたが、最近は LIKELY() つける変更が時々あるのでまた明示的に付ける方向みたいですね。それからローカル変数に klass やインスタンス変数テーブルを格納しておいて使いまわすのをやめていますがこちらはどういうことなんだろう。 また vm_getinstancevariable() と vm_setinstancevariable() を inline 関数にしています。 [ruby-core:74899] [Bug #12274]

svn: r54978 2016-05-12 00:04:28 +0900

version.h の日付更新。

tarui: r54979 2016-05-12 00:08:27 +0900

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

usa: r54980 2016-05-12 00:21:49 +0900

r54974 で mswin で qsort_s() を利用するようにするチェックで対象の Visual Studio のバージョンを 2012以降にしています。 古いバージョンには不具合だか互換性の問題があってテスト中に SEGV するそうです。

nobu: r54981 2016-05-12 01:39:24 +0900

r54980 の再修正で Visual Studio 2012 でも qsort_s() は使わず、それよりも新しい場合にのみ使うように条件を修正しています。

nobu: r54982 2016-05-12 01:54:10 +0900

標準添付ライブラリ mkmf.rb の have_library() や find_library() で try_func を呼ぶ時に main() を呼ぶソースを作ってチェックするようにしていて意味がなかったのをやめています。うーんこれは誤検出の可能性があったということなのかな。

nobu: r54983 2016-05-12 20:19:43 +0900

ext/extmk.rb で拡張ライブラリの extconf.rb の失敗を全拡張ライブラリの処理の最後にまとめて出力して、エラー表示が流れてしまわないようにしています。確かに openssl とか readline のリンク先の指定忘れてビルドされてないのに気がつかないことありますね。

kazu: r54984 2016-05-12 22:01:03 +0900

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

naruse: r54985 2016-05-13 03:12:45 +0900

configure.in で RUBY_FUNC_ATTRIBUTE() で定義する関数などの attribute のキーワードを noreturn -> __noreturn__ のようにアンダースコア2つで挟んだものを使うようにしています。マクロとなどと衝突するのを防ぐためとのこと。

naruse: r54986 2016-05-13 03:12:46 +0900

configure に gcc のビルトイン関数 __builtin_constant_p() の存在チェックを追加して defined(__GNUC__) && !defined(__PCC__) で判定していたところを HAVE_BUILTIN__BUILTIN_CONSTANT_P() でチェックするようにしています。

svn: r54987 2016-05-13 03:12:46 +0900

version.h の日付更新。

naruse: r54988 2016-05-13 03:12:47 +0900

GCC のバージョンをチェックするマクロ GCC_VERSION_SINCE を internal.h から include/ruby/defines.h に移動して include/ruby/ruby.h での preprocessor の分岐にも使うようにしています。

naruse: r54989 2016-05-13 03:27:05 +0900

r54988 で余分な文字を削ってしまっていたのを修正しています。