From 6ff1250739c57ce7f234a2148d3f6214da01b7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Tue, 29 Oct 2019 11:37:25 +0900 Subject: rb_method_basic_definition_p with CC Noticed that rb_method_basic_definition_p is frequently called. Its callers include vm_caller_setup_args_block(), rb_hash_default_value(), rb_num_neative_int_p(), and a lot more. It seems worth caching the method resolution part. Majority of rb_method_basic_definion_p() usages take fixed class and fixed method id combinations. Calculating ------------------------------------- ours trunk so_matrix 2.379 2.115 i/s - 1.000 times in 0.420409s 0.472879s Comparison: so_matrix ours: 2.4 i/s trunk: 2.1 i/s - 1.12x slower --- vm_insnhelper.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'vm_insnhelper.c') diff --git a/vm_insnhelper.c b/vm_insnhelper.c index a4bc276f04..5e1cfccf3c 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1433,13 +1433,9 @@ rb_vm_search_method_slowpath(struct rb_call_data *cd, VALUE klass) } static void -vm_search_method(struct rb_call_data *cd, VALUE recv) +vm_search_method_fastpath(struct rb_call_data *cd, VALUE klass) { struct rb_call_cache *cc = &cd->cc; - VALUE klass = CLASS_OF(recv); - - VM_ASSERT(klass != Qfalse); - VM_ASSERT(RBASIC_CLASS(klass) == 0 || rb_obj_is_kind_of(klass, rb_cClass)); #if OPT_INLINE_METHOD_CACHE if (LIKELY(RB_DEBUG_COUNTER_INC_UNLESS(mc_global_state_miss, @@ -1456,6 +1452,16 @@ vm_search_method(struct rb_call_data *cd, VALUE recv) rb_vm_search_method_slowpath(cd, klass); } +static void +vm_search_method(struct rb_call_data *cd, VALUE recv) +{ + VALUE klass = CLASS_OF(recv); + + VM_ASSERT(klass != Qfalse); + VM_ASSERT(RBASIC_CLASS(klass) == 0 || rb_obj_is_kind_of(klass, rb_cClass)); + vm_search_method_fastpath(cd, klass); +} + static inline int check_cfunc(const rb_callable_method_entry_t *me, VALUE (*func)()) { -- cgit v1.2.3