Skip to content
  • Jean Boussier's avatar
    d4f3dcf4
    Refactor VM root modules · d4f3dcf4
    Jean Boussier authored
    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.
    d4f3dcf4
    Refactor VM root modules
    Jean Boussier authored
    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.
Loading