[#41531] [Bug #3385] ext/dbm: accept various version of db — Takahiro Kambe <redmine@...>
Bug #3385: ext/dbm: accept various version of db
2010年6月3日23:38 Takahiro Kambe <redmine@ruby-lang.org>:
2011年11月12日8:14 Tanaka Akira <akr@fsij.org>:
[#41536] RUBY_DEBUG=gc_stress [FATAL] failed to allocate memory — Tanaka Akira <akr@...>
コンパイル時に RUBY_DEBUG_ENV というマクロを定義しておくと、
[#41543] [Bug #3398] 1.9.2 SEGV during test-all — Yuki Sonoda <redmine@...>
Bug #3398: 1.9.2 SEGV during test-all
[#41597] [Bug #3433] Error that occurs by BasicSocket#sendmsg — Masaya Tarui <redmine@...>
Bug #3433: Error that occurs by BasicSocket#sendmsg
[#41600] 質問・提案:cgi.rbの後継となるライブラリについて — Dice <tetradice@...>
Diceです。cgi.rbの後継ライブラリについて質問させてください。
藤岡です。
かくたにです。
藤岡さん、かくたにさん、返信ありがとうございます。
藤岡です。
Diceです。藤岡さん、返信ありがとうございます。
[#41610] [Bug #3443] requireが遅くなる — Yusuke Endoh <redmine@...>
Bug #3443: requireが遅くなる
[#41623] [Feature:trunk] argument delegation — Nobuyoshi Nakada <nobu@...>
なかだです。
遠藤です。
まつもと ゆきひろです
前田です。
[#41672] [Bug #3463] 1.9.2-preview3 で [BUG] gc_sweep(): unknown data type 0x0 — Tomoyuki Chikanaga <redmine@...>
チケット #3463 が更新されました。 (by Tomoyuki Chikanaga)
[#41674] [Bug #3464] win32ole failure load TYPELIB on mswin64 vista — sakiyama shin <redmine@...>
Bug #3464: win32ole failure load TYPELIB on mswin64 vista
[#41702] WIN32OLE_METHOD offset_vtbl — kuwamoto shintaro <beuniv@...>
こんばんわ
助田です。
こんにちは、なかむら(う)です。
助田です。
artonです。
2010/6/24 arton <artonx@yahoo.co.jp>:
[#41705] [Bug #3471][Rejected] ./miniruby sample/test.rbで1NotOK — Shyouhei Urabe <redmine@...>
チケット #3471 が更新されました。 (by Shyouhei Urabe)
2010年6月24日16:53 Shyouhei Urabe <redmine@ruby-lang.org>:
[#41711] [Bug #3473] make clear-installed-list — Usaku NAKAMURA <redmine@...>
Bug #3473: make clear-installed-list
[#41730] (ruby/tk) ruby_1_9_2 への backport — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#41752] [Bug #3490][Assigned] test_pack_utf8 failure on mswin64 — Yusuke Endoh <redmine@...>
チケット #3490 が更新されました。 (by Yusuke Endoh)
[#41760] Hash[] の引数が Array の場合の振る舞い — とみたまさひろ <tommy@...>
とみたです。
[ruby-dev:41610] [Bug #3443] requireが遅くなる
Bug #3443: requireが遅くなる
http://redmine.ruby-lang.org/issues/show/3443
起票者: Yusuke Endoh
ステータス: Open, 優先度: Normal
Target version: 1.9.2
ruby -v: ruby 1.9.3dev (2010-05-30 trunk 28086) [i386-cygwin]
[ruby-dev:41502] をチケット化します。
-----
三浦と申します。
1年ぶりくらいに最新バージョンのRubyでyarv2llvmを動かしてみたら、
すごく時間がかかるようになっていたので調べてみました。
環境は以下の通りです。
CPU AMD Athlon(tm)X2 Dual-Core QL-60 1.90 GHz
RAM 4GBytes
OS Windows Vista
CYGWIN_NT-6.0 miura-PC 1.7.5(0.225/5/3) 2010-04-12 19:07 i686 Cygwin
Ruby ruby 1.9.3dev (2010-05-30 trunk 28086) [i386-cygwin]
その結果、require時にファイル入力の後に大量のRead/Writeではない
File Operationが発生していることが分かりました。
さらに、strace(Cygwin版)を見たところ、次のようなシステムコールが
大量に発生していました。
857 67985110 [main] ruby 4896 open: open
(/home/miura/demo/yarv2llvm64/yarv2llvm/lib/vmtraverse.rb, 0x0)
101 67985211 [main] ruby 4896 normalize_posix_path: src
/home/miura/demo/yarv2llvm64/yarv2llvm/lib/vmtraverse.rb
96 67985307 [main] ruby 4896 normalize_posix_path:
/home/miura/demo/yarv2llvm64/yarv2llvm/lib/vmtraverse.rb =
normalize_posix_path
(/home/miura/demo/yarv2llvm64/yarv2llvm/lib/vmtraverse.rb)
96 67985403 [main] ruby 4896 mount_info::conv_to_win32_path:
conv_to_win32_path
(/home/miura/demo/yarv2llvm64/yarv2llvm/lib/vmtraverse.rb)
96 67985499 [main] ruby 4896 set_flags: flags: binary (0x2)
90 67985589 [main] ruby 4896 mount_info::conv_to_win32_path: src_path
/home/miura/demo/yarv2llvm64/yarv2llvm/lib/vmtraverse.rb, dst
C:\cygwin\home\miura\demo\yarv2llvm64\yarv2llvm\lib\vmtraverse.rb, flags
0x3000A, rc 0
954 67986543 [main] ruby 4896 symlink_info::check: 0x0 = NtCreateFile
(\??\C:\cygwin\home\miura\demo\yarv2llvm64\yarv2llvm\lib\vmtraverse.rb)
352 67986895 [main] ruby 4896 symlink_info::check: not a symlink
575 67987470 [main] ruby 4896 symlink_info::check: 0 = symlink.check
(C:\cygwin\home\miura\demo\yarv2llvm64\yarv2llvm\lib\vmtraverse.rb,
0x22A320) (0x3000A)
156 67987626 [main] ruby 4896 path_conv::check:
this->path(C:\cygwin\home\miura\demo\yarv2llvm64\yarv2llvm\lib\vmtraverse.rb),
has_acls(1)
144 67987770 [main] ruby 4896 build_fh_pc: fh 0x612269D4
103 67987873 [main] ruby 4896 fhandler_base::open:
(\??\C:\cygwin\home\miura\demo\yarv2llvm64\yarv2llvm\lib\vmtraverse.rb,
0x100000)
711 67988584 [main] ruby 4896 fhandler_base::set_flags: flags 0x100000,
supplied_bin 0x10000
これを見る限り、Cygwinではファイルのパスを得るために
ファイルシステムのアクセスを含む結構重い処理を行っているようです。
そこで、ファイルパスを繰り返し得る処理をしているところを
探したところ、iseq.cのprepare_iseq_build中の
iseq->filepath = filepath == Qnil ? Qnil : rb_realpath_internal(Qnil,
filepath, 1);
が見つかりました。試しにiseq->filepathを常にQnilにするように変更
して、実行速度の差を見てみました。
結果です。
time ruby -I . yarv2llvm.rb fib.rb
オリジナル
real 0m35.954s
user 0m4.163s
sys 0m14.351s
常にQnil
real 0m10.323s
user 0m2.525s
sys 0m3.197s
また、rb_realpath_internal(Qnil, filepath, 1)の結果をキャッシュする
ようにしてみました。その結果です。
キャッシュ
real 0m26.757s
user 0m3.291s
sys 0m10.623s
この実験で使った変更点を以下に示します。
なお、iseq_s_compileの
- rb_scan_args(argc, argv, "13", &src, &file, &path, &line, &opt);
+ rb_scan_args(argc, argv, "14", &src, &file, &path, &line, &opt);
は直接関係ないのですが、ついでに乗せておきます。
こちらも御検討してもらえると幸いです。
Index: iseq.c
===================================================================
--- iseq.c (revision 28086)
+++ iseq.c (working copy)
@@ -217,7 +217,22 @@
VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict);
+static VALUE path_cache;
+static VALUE realpath_cache;
static VALUE
+realpath_iseq(VALUE path)
+{
+ if (path_cache == path) {
+ return realpath_cache;
+ }
+
+ path_cache = path;
+ realpath_cache = rb_realpath_internal(Qnil, path, 1);
+
+ return realpath_cache;
+}
+
+static VALUE
prepare_iseq_build(rb_iseq_t *iseq,
VALUE name, VALUE filename, VALUE filepath, VALUE line_no,
VALUE parent, VALUE type, VALUE block_opt,
@@ -228,7 +243,9 @@
iseq->name = name;
iseq->filename = filename;
- iseq->filepath = filepath == Qnil ? Qnil : rb_realpath_internal(Qnil,
filepath, 1);
+ //iseq->filepath = filepath == Qnil ? Qnil : rb_realpath_internal(Qnil,
filepath, 1);
+ iseq->filepath = filepath == Qnil ? Qnil : realpath_iseq(filepath);
+ // iseq->filepath = Qnil;
iseq->line_no = (unsigned short)line_no; /* TODO: really enough? */
iseq->defined_method_id = 0;
iseq->mark_ary = rb_ary_tmp_new(3);
@@ -579,7 +596,7 @@
rb_secure(1);
- rb_scan_args(argc, argv, "13", &src, &file, &path, &line, &opt);
+ rb_scan_args(argc, argv, "14", &src, &file, &path, &line, &opt);
if (NIL_P(file)) file = rb_str_new2("<compiled>");
if (NIL_P(line)) line = INT2FIX(1);
@@ -1516,5 +1533,7 @@
rb_define_singleton_method(rb_cISeq, "compile_option=",
iseq_s_compile_option_set, 1);
rb_define_singleton_method(rb_cISeq, "disasm", iseq_s_disasm, 1);
rb_define_singleton_method(rb_cISeq, "disassemble", iseq_s_disasm, 1);
+
+ rb_global_variable(&path_cache);
}
----------------------------------------
http://redmine.ruby-lang.org