mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Refactor VM root modules
This `st_table` is used to both mark and pin classes defined from the C API. But `vm->mark_object_ary` already does both much more efficiently. Currently a Ruby process starts with 252 rooted classes, which uses `7224B` in an `st_table` or `2016B` in an `RArray`. So a baseline of 5kB saved, but since `mark_object_ary` is preallocated with `1024` slots but only use `405` of them, it's a net `7kB` save. `vm->mark_object_ary` is also being refactored. Prior to this changes, `mark_object_ary` was a regular `RArray`, but since this allows for references to be moved, it was marked a second time from `rb_vm_mark()` to pin these objects. This has the detrimental effect of marking these references on every minors even though it's a mostly append only list. But using a custom TypedData we can save from having to mark all the references on minor GC runs. Addtionally, immediate values are now ignored and not appended to `vm->mark_object_ary` as it's just wasted space.
This commit is contained in:
parent
16ec54ec41
commit
d4f3dcf4df
27 changed files with 167 additions and 101 deletions
4
ruby.c
4
ruby.c
|
@ -2202,7 +2202,7 @@ process_options_global_setup(const ruby_cmdline_options_t *opt, const rb_iseq_t
|
|||
|
||||
if ((rb_e_script = opt->e_script) != 0) {
|
||||
rb_str_freeze(rb_e_script);
|
||||
rb_gc_register_mark_object(opt->e_script);
|
||||
rb_vm_register_global_object(opt->e_script);
|
||||
}
|
||||
|
||||
rb_execution_context_t *ec = GET_EC();
|
||||
|
@ -3070,7 +3070,7 @@ ruby_process_options(int argc, char **argv)
|
|||
}
|
||||
set_progname(external_str_new_cstr(script_name)); /* for the time being */
|
||||
rb_argv0 = rb_str_new4(rb_progname);
|
||||
rb_gc_register_mark_object(rb_argv0);
|
||||
rb_vm_register_global_object(rb_argv0);
|
||||
|
||||
#ifndef HAVE_SETPROCTITLE
|
||||
ruby_init_setproctitle(argc, argv);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue