From d74fa8e55ce64904f2f99dfef4cbdff94e290672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Wed, 18 Sep 2019 17:18:48 +0900 Subject: reuse cc->call I noticed that in case of cache misshit, re-calculated cc->me can be the same method entry than the pevious one. That is an okay situation but can't we partially reuse the cache, because cc->call should still be valid then? One thing that has to be special-cased is when the method entry gets amended by some refinements. That happens behind-the-scene of call cache mechanism. We have to check if cc->me->def points to the previously saved one. Calculating ------------------------------------- trunk ours vm2_poly_same_method 1.534M 2.025M i/s - 6.000M times in 3.910203s 2.962752s Comparison: vm2_poly_same_method ours: 2025143.9 i/s trunk: 1534447.2 i/s - 1.32x slower --- internal.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'internal.h') diff --git a/internal.h b/internal.h index 3dbe9ad38e..2e8d23b085 100644 --- a/internal.h +++ b/internal.h @@ -2328,6 +2328,7 @@ enum method_missing_reason { MISSING_NONE = 0x40 }; struct rb_callable_method_entry_struct; +struct rb_method_definition_struct; struct rb_execution_context_struct; struct rb_control_frame_struct; struct rb_calling_info; @@ -2339,6 +2340,7 @@ struct rb_call_cache { /* inline cache: values */ const struct rb_callable_method_entry_struct *me; + const struct rb_method_definition_struct *def; VALUE (*call)(struct rb_execution_context_struct *ec, struct rb_control_frame_struct *cfp, -- cgit v1.2.3