ruby-changes:58094
From: =E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3 <ko1@a...>
Date: Thu, 3 Oct 2019 15:44:57 +0900 (JST)
Subject: [ruby-changes:58094] 3ffd98c5cd (master): add debug counters for vm_search_method_slowpath()
https://git.ruby-lang.org/ruby.git/commit/?id=3ffd98c5cd From 3ffd98c5cd040a4081617b3bc6f9062237937b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= <shyouhei@r...> Date: Tue, 1 Oct 2019 16:45:14 +0900 Subject: add debug counters for vm_search_method_slowpath() Implemented fine-grained inspection of cache misshits. Handy for counting the reasons why an inline method cache was evicted. diff --git a/debug_counter.h b/debug_counter.h index cb2222a..35ffe08 100644 --- a/debug_counter.h +++ b/debug_counter.h @@ -26,6 +26,11 @@ https://github.com/ruby/ruby/blob/trunk/debug_counter.h#L26 * * mc_cme_complement: callable_method_entry complement counts. * * mc_cme_complement_hit: callable_method_entry cache hit counts. * * mc_search_super: search_method() call counts. + * * mc_miss_by_nome: inline mc miss by no ment. + * * mc_miss_by_distinct: ... by distinct ment. + * * mc_miss_by_refine: ... by ment being refined. + * * mc_miss_by_visi: ... by visibility change. + * * mc_miss_spurious: spurious inline mc misshit. */ RB_DEBUG_COUNTER(mc_inline_hit) RB_DEBUG_COUNTER(mc_inline_miss) @@ -36,6 +41,11 @@ RB_DEBUG_COUNTER(mc_class_serial_miss) https://github.com/ruby/ruby/blob/trunk/debug_counter.h#L41 RB_DEBUG_COUNTER(mc_cme_complement) RB_DEBUG_COUNTER(mc_cme_complement_hit) RB_DEBUG_COUNTER(mc_search_super) +RB_DEBUG_COUNTER(mc_miss_by_nome) +RB_DEBUG_COUNTER(mc_miss_by_distinct) +RB_DEBUG_COUNTER(mc_miss_by_refine) +RB_DEBUG_COUNTER(mc_miss_by_visi) +RB_DEBUG_COUNTER(mc_miss_spurious) /* * call cache fastpath usage diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 127c8c3..f9c825c 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1386,12 +1386,15 @@ static inline vm_call_handler https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1386 calccall(const struct rb_call_info *ci, const struct rb_call_cache *cc, const rb_callable_method_entry_t *me) { if (UNLIKELY(!me)) { + RB_DEBUG_COUNTER_INC(mc_miss_by_nome); return vm_call_general; /* vm_call_method_nome() situation */ } else if (LIKELY(cc->me != me)) { + RB_DEBUG_COUNTER_INC(mc_miss_by_distinct); return vm_call_general; /* normal cases */ } else if (UNLIKELY(cc->def != me->def)) { + RB_DEBUG_COUNTER_INC(mc_miss_by_refine); return vm_call_general; /* cc->me was refined elsewhere */ } /* "Calling a formerly-public method, which is now privatised, with an @@ -1400,9 +1403,11 @@ calccall(const struct rb_call_info *ci, const struct rb_call_cache *cc, const rb https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1403 * Calling a private method without specifying a receiver is also safe. */ else if ((METHOD_ENTRY_VISI(cc->me) != METHOD_VISI_PUBLIC) && !(ci->flag & VM_CALL_FCALL)) { + RB_DEBUG_COUNTER_INC(mc_miss_by_visi); return vm_call_general; } else { + RB_DEBUG_COUNTER_INC(mc_miss_spurious); return cc->call; } } -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/