From: SASADA Koichi Date: 2009-06-10T10:49:47+09:00 Subject: [ruby-dev:38583] [Feature: trunk] GC.time  ささだです.  今まで何回 GC をやったか調べるための GC.count というのがあるのですが, これまでの GC にかかった時間を返す GC.time というメソッドを追加するのは どうでしょうか.  GC::Profiler を使えば,似たようなことは出来るような気がするのですが, この用途のためだけに使うのはちょっと重いし,整形された文字列でしか結果が 取れないので使いづらいので.... Index: gc.c =================================================================== --- gc.c (リビジョン 23657) +++ gc.c (作業コピー) @@ -356,6 +356,7 @@ } profile; struct gc_list *global_list; unsigned int count; + double time; int gc_stress; } rb_objspace_t; @@ -2207,6 +2208,8 @@ { struct gc_list *list; rb_thread_t *th = GET_THREAD(); + double invoke_time = getrusage_time(); + INIT_GC_PROF_PARAMS; if (GC_NOTIFY) printf("start garbage_collect()\n"); @@ -2286,6 +2289,9 @@ GC_PROF_TIMER_STOP; if (GC_NOTIFY) printf("end garbage_collect()\n"); + + objspace->time += getrusage_time() - invoke_time; + return Qtrue; } @@ -2950,6 +2956,12 @@ return UINT2NUM((&rb_objspace)->count); } +static VALUE +gc_time(VALUE self) +{ + return DBL2NUM((&rb_objspace)->time); +} + #if CALC_EXACT_MALLOC_SIZE /* * call-seq: @@ -3122,6 +3134,7 @@ rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0); rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1); rb_define_singleton_method(rb_mGC, "count", gc_count, 0); + rb_define_singleton_method(rb_mGC, "time", gc_time, 0); rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0); rb_mProfiler = rb_define_module_under(rb_mGC, "Profiler"); -- // SASADA Koichi at atdot dot net