Feature #1596
closedGC.time
Description
=begin
ささだです.
今まで何回 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
=end
Updated by marcandre (Marc-Andre Lafortune) over 15 years ago
- Category set to core
- Assignee set to matz (Yukihiro Matsumoto)
=begin
=end
Updated by mame (Yusuke Endoh) about 15 years ago
- Status changed from Open to Closed
=begin
遠藤です。
今まで何回 GC をやったか調べるための GC.count というのがあるのですが,
これまでの GC にかかった時間を返す GC.time というメソッドを追加するのは
どうでしょうか.
#2480 で GC::Profiler.total_time が導入されたので、close します。
せっかくなので何回か使ってみた経験を書いておきますと、生きている
オブジェクトが大量にある (= 一回あたりのGC に時間がかかる) ときは
それなりの精度がでるのですが、その場限りのオブジェクトがいっぱい
生成される (= 短い GC がいっぱい走る) ときは誤差が蓄積されて全然
あてにならない感じです。
--
Yusuke Endoh [email protected]
=end