Project

General

Profile

Actions

Feature #1596

closed

GC.time

Added by ko1 (Koichi Sasada) almost 16 years ago. Updated about 14 years ago.

Status:
Closed
Target version:
-
[ruby-dev:38583]

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

Actions #1

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

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

=begin

=end

Actions #2

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
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0