benchmarks: small refactorings
This PR contains old commits from a few months ago which come from working on the Benchmarks section of our boxroot paper.
- Rename the 'ref' library/interface (a memory location holding a value, allocating on the heap or registered as a root) into 'cell' to avoid confusion with OCaml native references or other uses of 'ref'.
- Support an additional naming scheme for the various 'cell' implementations to match the current names in the paper. (I still support the old names to preserve existing benchmark scripts.)
- A new 'boxroot-boxed' implementation of the Cell interface that mallocates a new memory block and stores a boxroot inside it.
Our 'cell' implementations relying on the standard OCaml GC root interface have to mallocate a new memory block to register as a root, so they consume space both via malloc and through the OCaml runtime's skiplist. This makes the comparison with raw boxroot arguably unfair, because boxroot only consumes memory in the pool (the equivalent of the skiplist) without requiring a pre-allocated block. The new boxroot-boxed implementation controls against this difference, it is now easy to tell in a benchmark whether the disadvantage of 'generational' comes from the malloc or from the skiplist. (In fact in the message-passing benchmark that I am working on I observe that boxroot-boxed is as slow as generational, so the observed overhead does probably come from my system allocator.)