模組 GC::Profiler
GC
分析器提供存取 GC
執行資訊,包括時間、長度和物件空間大小。
範例
GC::Profiler.enable require 'rdoc/rdoc' GC::Profiler.report GC::Profiler.disable
另請參閱 GC.count
、GC.malloc_allocated_size
和 GC.malloc_allocations
公開類別方法
GC::Profiler.clear → nil 按一下以切換來源
清除 GC 分析器資料。
static VALUE gc_profile_clear(VALUE _) { rb_objspace_t *objspace = &rb_objspace; void *p = objspace->profile.records; objspace->profile.records = NULL; objspace->profile.size = 0; objspace->profile.next_index = 0; objspace->profile.current_record = 0; free(p); return Qnil; }
GC::Profiler.disable → nil 按一下以切換來源
停止 GC 分析器。
static VALUE gc_profile_disable(VALUE _) { rb_objspace_t *objspace = &rb_objspace; objspace->profile.run = FALSE; objspace->profile.current_record = 0; return Qnil; }
GC::Profiler.enable → nil 按一下以切換來源
啟動 GC 分析器。
static VALUE gc_profile_enable(VALUE _) { rb_objspace_t *objspace = &rb_objspace; objspace->profile.run = TRUE; objspace->profile.current_record = 0; return Qnil; }
GC::Profiler.enabled? → true 或 false 按一下以切換來源
GC 分析模式的目前狀態。
static VALUE gc_profile_enable_get(VALUE self) { rb_objspace_t *objspace = &rb_objspace; return RBOOL(objspace->profile.run); }
GC::Profiler.raw_data → [雜湊, ...] 按一下以切換來源
傳回一個由 :GC_INVOKE_TIME
從最早到最新的順序排列的個別原始分析資料雜湊的陣列。
例如
[ { :GC_TIME=>1.3000000000000858e-05, :GC_INVOKE_TIME=>0.010634999999999999, :HEAP_USE_SIZE=>289640, :HEAP_TOTAL_SIZE=>588960, :HEAP_TOTAL_OBJECTS=>14724, :GC_IS_MARKED=>false }, # ... ]
金鑰表示
:GC_TIME
-
此
GC
執行花費的秒數 :GC_INVOKE_TIME
-
從啟動到呼叫
GC
花費的秒數 :HEAP_USE_SIZE
-
已使用的堆總位元組數
:HEAP_TOTAL_SIZE
-
堆的總大小(位元組)
:HEAP_TOTAL_OBJECTS
-
物件總數
:GC_IS_MARKED
-
如果
GC
處於標記階段,則傳回true
如果 Ruby 是使用 GC_PROFILE_MORE_DETAIL
建置的,您也可以存取下列雜湊金鑰
:GC_MARK_TIME
:GC_SWEEP_TIME
:ALLOCATE_INCREASE
:ALLOCATE_LIMIT
:HEAP_USE_PAGES
:HEAP_LIVE_OBJECTS
:HEAP_FREE_OBJECTS
:HAVE_FINALIZE
static VALUE gc_profile_record_get(VALUE _) { VALUE prof; VALUE gc_profile = rb_ary_new(); size_t i; rb_objspace_t *objspace = (&rb_objspace); if (!objspace->profile.run) { return Qnil; } for (i =0; i < objspace->profile.next_index; i++) { gc_profile_record *record = &objspace->profile.records[i]; prof = rb_hash_new(); rb_hash_aset(prof, ID2SYM(rb_intern("GC_FLAGS")), gc_info_decode(objspace, rb_hash_new(), record->flags)); rb_hash_aset(prof, ID2SYM(rb_intern("GC_TIME")), DBL2NUM(record->gc_time)); rb_hash_aset(prof, ID2SYM(rb_intern("GC_INVOKE_TIME")), DBL2NUM(record->gc_invoke_time)); rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_USE_SIZE")), SIZET2NUM(record->heap_use_size)); rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_TOTAL_SIZE")), SIZET2NUM(record->heap_total_size)); rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_TOTAL_OBJECTS")), SIZET2NUM(record->heap_total_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("MOVED_OBJECTS")), SIZET2NUM(record->moved_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("GC_IS_MARKED")), Qtrue); #if GC_PROFILE_MORE_DETAIL rb_hash_aset(prof, ID2SYM(rb_intern("GC_MARK_TIME")), DBL2NUM(record->gc_mark_time)); rb_hash_aset(prof, ID2SYM(rb_intern("GC_SWEEP_TIME")), DBL2NUM(record->gc_sweep_time)); rb_hash_aset(prof, ID2SYM(rb_intern("ALLOCATE_INCREASE")), SIZET2NUM(record->allocate_increase)); rb_hash_aset(prof, ID2SYM(rb_intern("ALLOCATE_LIMIT")), SIZET2NUM(record->allocate_limit)); rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_USE_PAGES")), SIZET2NUM(record->heap_use_pages)); rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_LIVE_OBJECTS")), SIZET2NUM(record->heap_live_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("HEAP_FREE_OBJECTS")), SIZET2NUM(record->heap_free_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("REMOVING_OBJECTS")), SIZET2NUM(record->removing_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("EMPTY_OBJECTS")), SIZET2NUM(record->empty_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("HAVE_FINALIZE")), RBOOL(record->flags & GPR_FLAG_HAVE_FINALIZE)); #endif #if RGENGC_PROFILE > 0 rb_hash_aset(prof, ID2SYM(rb_intern("OLD_OBJECTS")), SIZET2NUM(record->old_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("REMEMBERED_NORMAL_OBJECTS")), SIZET2NUM(record->remembered_normal_objects)); rb_hash_aset(prof, ID2SYM(rb_intern("REMEMBERED_SHADY_OBJECTS")), SIZET2NUM(record->remembered_shady_objects)); #endif rb_ary_push(gc_profile, prof); } return gc_profile; }
GC::Profiler.report 按一下以切換來源
GC::Profiler.report(io)
將 GC::Profiler.result
寫入 $stdout
或指定的 IO
物件。
static VALUE gc_profile_report(int argc, VALUE *argv, VALUE self) { VALUE out; out = (!rb_check_arity(argc, 0, 1) ? rb_stdout : argv[0]); gc_profile_dump_on(out, rb_io_write); return Qnil; }
GC::Profiler.result → String 按一下以切換來源
傳回剖析資料報告,例如
GC 1 invokes. Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC time(ms) 1 0.012 159240 212940 10647 0.00000000000001530000
static VALUE gc_profile_result(VALUE _) { VALUE str = rb_str_buf_new(0); gc_profile_dump_on(str, rb_str_buf_append); return str; }
GC::Profiler.total_time → float 按一下以切換來源
用於垃圾回收的總時間(以秒為單位)
static VALUE gc_profile_total_time(VALUE self) { double time = 0; rb_objspace_t *objspace = &rb_objspace; if (objspace->profile.run && objspace->profile.next_index > 0) { size_t i; size_t count = objspace->profile.next_index; for (i = 0; i < count; i++) { time += objspace->profile.records[i].gc_time; } } return DBL2NUM(time); }