mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Optimize callcache invalidation for refinements
Fixes [Bug #21201] This change addresses a performance regression where defining methods inside `refine` blocks caused severe slowdowns. The issue was due to `rb_clear_all_refinement_method_cache()` triggering a full object space scan via `rb_objspace_each_objects` to find and invalidate affected callcaches, which is very inefficient. To fix this, I introduce `vm->cc_refinement_table` to track callcaches related to refinements. This allows us to invalidate only the necessary callcaches without scanning the entire heap, resulting in significant performance improvement.
This commit is contained in:
parent
d0b5f31554
commit
c8ddc0a843
Notes:
git
2025-06-09 03:33:51 +00:00
9 changed files with 111 additions and 17 deletions
6
vm.c
6
vm.c
|
@ -3194,6 +3194,10 @@ ruby_vm_destruct(rb_vm_t *vm)
|
|||
st_free_table(vm->ci_table);
|
||||
vm->ci_table = NULL;
|
||||
}
|
||||
if (vm->cc_refinement_table) {
|
||||
rb_set_free_table(vm->cc_refinement_table);
|
||||
vm->cc_refinement_table = NULL;
|
||||
}
|
||||
RB_ALTSTACK_FREE(vm->main_altstack);
|
||||
|
||||
struct global_object_list *next;
|
||||
|
@ -3294,6 +3298,7 @@ vm_memsize(const void *ptr)
|
|||
vm_memsize_builtin_function_table(vm->builtin_function_table) +
|
||||
rb_id_table_memsize(vm->negative_cme_table) +
|
||||
rb_st_memsize(vm->overloaded_cme_table) +
|
||||
rb_set_memsize(vm->cc_refinement_table) +
|
||||
vm_memsize_constant_cache()
|
||||
);
|
||||
|
||||
|
@ -4503,6 +4508,7 @@ Init_vm_objects(void)
|
|||
vm->mark_object_ary = pin_array_list_new(Qnil);
|
||||
vm->loading_table = st_init_strtable();
|
||||
vm->ci_table = st_init_table(&vm_ci_hashtype);
|
||||
vm->cc_refinement_table = rb_set_init_numtable();
|
||||
}
|
||||
|
||||
// Stub for builtin function when not building YJIT units
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue