Feature #1596

GC.time

Added by ko1 (Koichi Sasada) almost 3 years ago. Updated about 1 year ago.

[ruby-dev:38583]
Status:Closed Start date:
Priority:Low Due date:
Assignee:matz (Yukihiro Matsumoto) % Done:

0%

Category:core
Target version:-

Description

 ささだです.

 今まで何回 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

History

Updated by marcandre (Marc-Andre Lafortune) over 2 years ago

  • Category set to core
  • Assignee set to matz (Yukihiro Matsumoto)

Updated by mame (Yusuke Endoh) about 2 years ago

  • Status changed from Open to Closed
遠藤です。

>  今まで何回 GC をやったか調べるための GC.count というのがあるのですが,
> これまでの GC にかかった時間を返す GC.time というメソッドを追加するのは
> どうでしょうか.

#2480 で GC::Profiler.total_time が導入されたので、close します。

せっかくなので何回か使ってみた経験を書いておきますと、生きている
オブジェクトが大量にある (= 一回あたりのGC に時間がかかる) ときは
それなりの精度がでるのですが、その場限りのオブジェクトがいっぱい
生成される (= 短い GC がいっぱい走る) ときは誤差が蓄積されて全然
あてにならない感じです。

-- 
Yusuke Endoh <mame@tsg.ne.jp>

Also available in: Atom PDF