Feature #10917 ยป gc-total-time.patch
gc.c | ||
---|---|---|
rb_event_flag_t hook_events;
|
||
size_t total_allocated_objects;
|
||
double gc_total_time;
|
||
rb_heap_t eden_heap;
|
||
rb_heap_t tomb_heap; /* heap for zombies and ghosts */
|
||
... | ... | |
gc_stat_sym_total_freed_pages,
|
||
gc_stat_sym_total_allocated_objects,
|
||
gc_stat_sym_total_freed_objects,
|
||
gc_stat_sym_total_time,
|
||
gc_stat_sym_malloc_increase_bytes,
|
||
gc_stat_sym_malloc_increase_bytes_limit,
|
||
#if USE_RGENGC
|
||
... | ... | |
S(total_freed_pages);
|
||
S(total_allocated_objects);
|
||
S(total_freed_objects);
|
||
S(total_time);
|
||
S(malloc_increase_bytes);
|
||
S(malloc_increase_bytes_limit);
|
||
#if USE_RGENGC
|
||
... | ... | |
SET(total_freed_pages, objspace->profile.total_freed_pages);
|
||
SET(total_allocated_objects, objspace->total_allocated_objects);
|
||
SET(total_freed_objects, objspace->profile.total_freed_objects);
|
||
SET(total_time, NUM2SIZET(DBL2NUM(objspace->gc_total_time * 1000000)));
|
||
SET(malloc_increase_bytes, malloc_increase);
|
||
SET(malloc_increase_bytes_limit, malloc_limit);
|
||
#if USE_RGENGC
|
||
... | ... | |
* :total_freed_pages=>0,
|
||
* :total_allocated_objects=>7796,
|
||
* :total_freed_objects=>83,
|
||
* :total_time=>1978,
|
||
* :malloc_increase_bytes=>2389312,
|
||
* :malloc_increase_bytes_limit=>16777216,
|
||
* :minor_gc_count=>0,
|
||
... | ... | |
{
|
||
if (gc_prof_enabled(objspace)) {
|
||
gc_profile_record *record = gc_prof_record(objspace);
|
||
record->gc_time = elapsed_time_from(record->gc_invoke_time);
|
||
double elapsed_time = elapsed_time_from(record->gc_invoke_time);
|
||
objspace->gc_total_time += elapsed_time;
|
||
record->gc_time = elapsed_time;
|
||
record->gc_invoke_time -= objspace->profile.invoke_time;
|
||
}
|
||
}
|
||
... | ... | |
if (record->gc_time > 0) {
|
||
sweep_time = elapsed_time_from(objspace->profile.gc_sweep_start_time);
|
||
/* need to accumulate GC time for lazy sweep after gc() */
|
||
objspace->gc_total_time += sweep_time;
|
||
record->gc_time += sweep_time;
|
||
}
|
||
else if (GC_PROFILE_MORE_DETAIL) {
|
test/ruby/test_gc.rb | ||
---|---|---|
GC::Profiler.disable
|
||
end
|
||
def test_gc_stat_total_time
|
||
GC::Profiler.enable
|
||
GC::Profiler.clear
|
||
GC.start
|
||
assert_operator(GC.stat[:total_time], :>=, 0)
|
||
ensure
|
||
GC::Profiler.disable
|
||
end
|
||
def test_gc_stat_total_time_when_disabled
|
||
GC::Profiler.disable
|
||
original = GC.stat[:total_time]
|
||
GC.start
|
||
assert_operator(GC.stat[:total_time], :==, original)
|
||
ensure
|
||
GC::Profiler.disable
|
||
end
|
||
def test_gc_stat_total_time_is_monotonic
|
||
GC::Profiler.enable
|
||
GC::Profiler.clear
|
||
GC.start
|
||
GC::Profiler.clear
|
||
assert_operator(GC.stat[:total_time], :>=, 0)
|
||
ensure
|
||
GC::Profiler.disable
|
||
end
|
||
def test_finalizing_main_thread
|
||
assert_in_out_err(%w[--disable-gems], <<-EOS, ["\"finalize\""], [], "[ruby-dev:46647]")
|
||
ObjectSpace.define_finalizer(Thread.main) { p 'finalize' }
|