ruby-trunk-changes r37468 - r37482

今日は 64bit 版 Windows での dl の不具合修正のほか、たくさんファイルを require した時の require のパフォーマンスの改善がありました。Rails の起動が早くなるかもしれないですね。

naruse:r37468 2012-11-05 06:14:19 +0900

CGI::Html5#element_init でタグ生成メソッド群を定義する前に既に定義済みでないかチェックして再定義をしないでスキップするようにしています。

svn:r37469 2012-11-05 06:14:23 +0900

version.h の日付更新。

xibbar:r37470 2012-11-05 09:57:41 +0900

NEWS ファイルに CGI::Html5 のタグ生成メソッド群の追加と、CGI#header のメソッドの変更(元の header は http_header に改名されて header は header タグ生成メソッドになった)を追記しています。

xibbar:r37471 2012-11-05 09:57:45 +0900

CGI#read_multipart でリクエストを Tempfile として受け付けた時にその一時ファイルを読み終わるごとに順次明示的に削除するようにしています。また例外発生時はまとめて消すようにしています。

zzak:r37472 2012-11-05 10:19:09 +0900

URI::HTTP.build の rdoc のサンプルの typo を修正。

naruse:r37473 2012-11-05 11:34:17 +0900

r37471 の ChangeLog のエントリ追記、および再修正。 Tempfile を使う前に defined? で Tempfile が定義済みかチェックするようにしています。また ensure 節で例外発生時に消す時には変数 tempfile が初期化済みかのチェックを追加しています。

kosaki:r37474 2012-11-05 11:46:41 +0900

native_thread_init() と native_thread_destroy() で #if HAVE_PTHREAD_CONDATTR_INIT で native_cond_{initialize,destroy} の呼び出しをくくっていたのをやめています。この処理が抜けていると th->native_thread_data.sleep_cond が未初期化になってしまうことと、native_cond_{initialize,destroy}() の内部で同様の条件コンパイルをしているので呼び出しても問題ない(というか呼ばないと else の時の初期化が漏れる)ということです。 [Bug #6825]

shirosaki:r37475 2012-11-05 23:00:35 +0900

cygwin/GNUmakefile.in で uncommon.mk を include する位置を上に移動しています。 uncommon.mk で定義する変数を使っている場所が include しているところより上にあったので移動しているようです。 [ruby-core:48858] [Bug #7277]

shirosaki:r37476 2012-11-05 23:00:41 +0900

拡張ライブラリ dl の Windowx 64bit 版でのポインタ型の String#unpack の型指定を修正しています。 [ruby-core:47451] [Bug #6990]

shirosaki:r37477 2012-11-06 00:24:03 +0900

load.c の loaded_feature_path() のコメントとして引数が何を指すのかを説明する文章を追記しています。また rb_feature_p() にもコメントを追記しています。 ChangeLog にはコメントについてだけ書かれているのですが実際には loaded_feature_path() でループ内の return を外に括り出すリファクタリングや feature 名とファイルパスの文字列長をチェックする条件の変更なども入っています。 [ruby-core:47970] [Bug #7158]

shirosaki:r37478 2012-11-06 00:24:07 +0900

C API rb_ary_shared_with_p() を追加しています。これは2つの Array を引数に受け取ってその2つがバッファを共有しているかどうかをチェックして返す関数です。 また r37477 の typo で C の文法エラーになっていたのを修正しています。 [ruby-core:47970] [Bug #7158]

svn:r37479 2012-11-06 00:24:08 +0900

version.h の日付更新。

shirosaki:r37480 2012-11-06 00:27:01 +0900

全体としては require の高速化のための変更です。 まず rb_hash_clear() を公開 API *1にしています。また features_index として features(require 済みのファイル)を Hash で管理するようにしています。 rb_hash_clear() と r37478 で追加した rb_ary_shared_with_p() はインデックスの再構築に関連して使われていて、vm->loaded_feature の配列を vm->loaded_features_snapshot としてコピー(バッファを共有している)を保持しておいて、rb_ary_shared_with_p() でこの2つが共有されたままかどうか、つまり features リストに変更がないかどうかを監視して、変更されていたら Hash で作るインデックスをクリアして再構築するようにしています。また features リストに格納する文字列は freeze するようにして、配列内の文字列を直接破壊的操作で変更することを禁じています。これは配列の変更検出するだけで feature リストの変更を確実に知ることができるようにするための措置と思われます。 これにより require で既に require 済みでないかのチェックに Array の線形探索が不要になるため大量の feature をロードした時の require の性能劣化を抑えているようです。 [ruby-core:47970] [Bug #7158]

shirosaki:r37481 2012-11-06 00:27:05 +0900

もうひとつ require の高速化です。今度は $LOAD_PATH の中身の文字列を freeze するようにしています。そして $LOAD_PATH の内容のパスを絶対パスに展開した結果を rb_vm_t::expanded_load_path に保存しておいて、これも rb_ary_shared_with_p() で load_path に変更がないかチェックして変更があった時だけ再構築するようにしています。また内容を freeze する関係から(?)、$LOAD_PATH に格納するオブジェクトは文字列でなければ to_str で文字列に変換するようにしています。 これにより require の度に $LOAD_PATH から絶対パスに展開されたパスを毎回構築する処理を省いています。 [ruby-core:47970] [Bug #7158]

shirosaki:r37482 2012-11-06 00:27:08 +0900

r37481 の追加修正っぽいです。おそらく $LOAD_PATH に相対パスが含まれていた時にカレントディレクトリの変更があった時に絶対パスに展開したロードパスのキャッシュを再構築する処理がメインかと思います。あと LOAD_PATH が文字列だったら to_path メソッドを呼んで変換する処理はスキップするようにしています。 [ruby-core:47970] [Bug #7158]

*1:include/ruby/intern.h で宣言しているのであまり積極的な公開ではないかもしれないですが