[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]