Open-addressing hash map
Hand-rolled FNV-1a hash table, 100k mixed put/get/delete operations. No built-in map allowed.
Runtime · median per inner-loop window
Full statistics
| Runner | N | Compile | Runtime | P95 | Stddev | RSS | vs pipit | Status |
|---|---|---|---|---|---|---|---|---|
| Native Gocompiled | 7 | 108 ms | 22.6 ms | 24.1 ms | 553 µs | 1.62 GiB | 0.08× | OK |
| Pipitbytecode VM | 7 | 2.44 ms | 292 ms | 308 ms | 6.38 ms | 591 MiB | 1.00× | OK |
| CPython 3.14bytecode VM | 7 | 769 µs | 659 ms | 660 ms | 3.23 ms | n/a | 2.25× | OK |
| PyPy 7.3tracing JIT | 7 | 544 µs | 94.5 ms | 110 ms | 7.14 ms | n/a | 0.32× | OK |
| tengobytecode VM | 7 | 408 µs | 1.60 s | 1.62 s | 28.8 ms | 1.69 GiB | 5.46× | OK |
| scriggobytecode VM | 0 | n/a | n/a | n/a | n/a | n/a | n/a | unsupported |
| mvmbytecode VM | 7 | 738 µs | 764 ms | 774 ms | 4.74 ms | 1.69 GiB | 2.61× | OK |
| yaegiAST walker | 7 | 628 µs | 1.47 s | 1.51 s | 31.9 ms | 1.69 GiB | 5.01× | OK |
Workload & symmetry rules
Workload
Build a HashTable with parallel keys[], values[], and state[] arrays (0=empty, 1=occupied, 2=tombstone). Linear probing on collision, doubles capacity when load > 70%. Hash function is byte-by-byte FNV-1a. A deterministic LCG drives 100,000 mixed operations.
Symmetry rules
- No built-in
map/dictanywhere in the hot path. - No built-in or stdlib hash functions; FNV-1a must be hand-rolled.
- Power-of-two capacity, linear probing, tombstone deletes: every runner uses the same algorithm.
Why this benchmark exists
Pure interpreter throughput without the cheat of a C-level hash table. Reveals what the interpreter's array / arithmetic / loop performance looks like under sustained load.
Source code
pipit / Go
pipit_source.gonative Go
native_main.goCPython / PyPy
cpython.pytengo
script.tengo