Feature #1596
GC.time
| Status: | Closed | Start date: | ||
|---|---|---|---|---|
| Priority: | Low | Due date: | ||
| Assignee: | % 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>