tvl-depot/web
Vincent Ambo d6c57eb957 refactor(tvix/eval): ensure VM operations fit in a single byte
This replaces the OpCode enum with a new Op enum which is guaranteed to fit in a
single byte. Instead of carrying enum variants with data, every variant that has
runtime data encodes it into the `Vec<u8>` that a `Chunk` now carries.

This has several advantages:

* Less stack space is required at runtime, and fewer allocations are required
  while compiling.
* The OpCode doesn't need to carry "weird" special-cased data variants anymore.
* It is faster (albeit, not by much). On my laptop, results consistently look
  approximately like this:

  Benchmark 1: ./before -E '(import <nixpkgs> {}).firefox.outPath' --log-level ERROR --no-warnings
  Time (mean ± σ):      8.224 s ±  0.272 s    [User: 7.149 s, System: 0.688 s]
  Range (min … max):    7.759 s …  8.583 s    10 runs

  Benchmark 2: ./after -E '(import <nixpkgs> {}).firefox.outPath' --log-level ERROR --no-warnings
  Time (mean ± σ):      8.000 s ±  0.198 s    [User: 7.036 s, System: 0.633 s]
  Range (min … max):    7.718 s …  8.334 s    10 runs

  See notes below for why the performance impact might be less than expected.
* It is faster while at the same time dropping some optimisations we previously
  performed.

This has several disadvantages:

* The code is closer to how one would write it in C or Go.
* Bit shifting!
* There is (for now) slightly more code than before.

On performance I have the following thoughts at the moment:

In order to prepare for adding GC, there's a couple of places in Tvix where I'd
like to fence off certain kinds of complexity (such as mutating bytecode, which,
for various reaons, also has to be part of data that is subject to GC). With
this change, we can drop optimisations like retroactively modifying existing
bytecode and *still* achieve better performance than before.

I believe that this is currently worth it to pave the way for changes that are
more significant for performance.

In general this also opens other avenues of optimisation: For example, we can
profile which argument sizes actually exist and remove the copy overhead of
varint decoding (which does show up in profiles) by using more adequately sized
types for, e.g., constant indices.

Known regressions:

* Op::Constant is no longer printing its values in disassembly (this can be
  fixed, I just didn't get around to it, will do separately).

Change-Id: Id9b3a4254623a45de03069dbdb70b8349e976743
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12191
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
2024-08-19 11:02:50 +00:00
..
atom-feed chore(3p/sources): Bump channels & overlays 2022-09-28 08:02:31 +00:00
atward chore(web/atward): bump cargo dependencies 2023-11-12 22:47:09 +00:00
blog feat(web/blog): add option to disable tagfilter per-post 2023-09-08 13:51:26 +00:00
bubblegum feat(tvix/docs): switch to mdbook 2024-03-03 16:52:38 +00:00
cgit-tvl refactor(web/cgit-tvl): Move cgit config back out of module 2022-06-27 14:15:07 +00:00
converse chore(web/converse): bump all dependencies within bounds 2022-12-02 14:27:30 +00:00
panettone feat(web/panettone): Create users table 2024-04-19 18:42:37 +00:00
pwcrypt chore(3p/sources): Bump channels & overlays 2024-06-08 15:20:48 +00:00
static refactor(tazjin/homepage): long overdue entry list rework 2023-06-15 23:26:57 +00:00
todolist chore(3p/sources): Bump channels & overlays 2022-09-28 08:02:31 +00:00
tvixbolt refactor(tvix/eval): ensure VM operations fit in a single byte 2024-08-19 11:02:50 +00:00
tvl fix(web/tvl/2024-08-tvix-update): small fixes 2024-08-09 19:18:01 +00:00
volgasprint feat(web/volgasprint): add sprint logo(s) 2024-03-05 10:26:58 +00:00
inbox.nix feat(web/inbox): add landing page for inbox.tvl.su 2022-12-28 08:17:45 +00:00