Over the past year, I have worked on getting a much more updated GC that currently the Stock LuaJIT 2.1.0-beta3 does not have.
This is based on Mike's now forgotten 3.0 Proposal Sheet, which indicates improvements directly tied to the GC itself.
-
Arena allocator - A new arena-based allocator that groups objects into large, aligned memory blocks, an alternative to the stock heap allocator.
-
Generational collector - Objects are organized into minor and major so that long-lived objects aren't re-scanned on every cycle.
-
Quad-color marking - From Mike's 3.0 concept paper, splitting gray into light-gray and dark-gray so the write barrier only has to check a single gray bit (a 2-3 instruction fast path).
-
Immortal internals - Core always-present LuaJIT objects (main thread, registry, globals, interned keyword/error/FFI-type strings, etc.) are treated as permanent, kept alive and skipped by normal sweeping since they should always exist.
-
Smart Promotion - Certain objects in LuaJIT can be auto-set to the highest tier, in this case proto's and their constants to reduce GC overhead further in tier 0.
-
2.1.0-beta3 base - Deliberately kept on 2.1.0-beta3 (a stable base for embedded/game-engine use) rather than rolling release, with select patches carried forward.
LuaJIT x64 - Stock vs GMNGC (my new GC)
Mops/s - Memory Operations per Second
gen_churn Mops/s - 18.8 - 29.9 - 1.59x - ~59% improvement
gen_churn time - 0.27s - 0.17s - 0.63x - ~37% improvement
gen_churn peak heap - 33.4 MB - 22.5 MB - 0.67x - ~33% improvement
closure_alloc Mops/s - 20.2 - 22.5 - 1.11x - ~11% improvement
str_intern Mops/s - 15.9 - 16.8 - 1.06x - ~6% improvement
jit_numeric Mops/s - 769 - 769 - 1.00x - none
tab_alloc Mops/s - 37.6 - 31.5 - 0.84x - ~16% loss (don't have full fit allocator just yet so yea)
full_gc ms - 24.6 - 28.2 - 1.15x - ~15% loss (expected since major minor root chain but this can be improved clearly)
baseline heap - 50.2 KB - 53.9 KB - 1.07x - ~7% loss (inevitable due to bitmap overhead and headers from arena)
I am in the process of ironing out UAF & UB failures from this project before releasing here. (Currently it works but infested with time-based UAF & UB failures, that will only be found overtime as I continue to test it)
Over the past year, I have worked on getting a much more updated GC that currently the Stock LuaJIT 2.1.0-beta3 does not have.
This is based on Mike's now forgotten 3.0 Proposal Sheet, which indicates improvements directly tied to the GC itself.
Arena allocator - A new arena-based allocator that groups objects into large, aligned memory blocks, an alternative to the stock heap allocator.
Generational collector - Objects are organized into minor and major so that long-lived objects aren't re-scanned on every cycle.
Quad-color marking - From Mike's 3.0 concept paper, splitting gray into light-gray and dark-gray so the write barrier only has to check a single gray bit (a 2-3 instruction fast path).
Immortal internals - Core always-present LuaJIT objects (main thread, registry, globals, interned keyword/error/FFI-type strings, etc.) are treated as permanent, kept alive and skipped by normal sweeping since they should always exist.
Smart Promotion - Certain objects in LuaJIT can be auto-set to the highest tier, in this case proto's and their constants to reduce GC overhead further in tier 0.
2.1.0-beta3 base - Deliberately kept on 2.1.0-beta3 (a stable base for embedded/game-engine use) rather than rolling release, with select patches carried forward.
I am in the process of ironing out UAF & UB failures from this project before releasing here. (Currently it works but infested with time-based UAF & UB failures, that will only be found overtime as I continue to test it)