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 piko | Status |
|---|---|---|---|---|---|---|---|---|
| Native Gocompiled | 10 | 181 ms | 22.5 ms | 22.7 ms | 191 µs | 68 MiB | 0.04× | OK |
| Piko interpbytecode VM | 10 | 2.58 ms | 506 ms | 508 ms | 1.04 ms | 313 MiB | 1.00× | OK |
| CPython 3.13bytecode VM | 10 | 627 µs | 673 ms | 684 ms | 9.35 ms | n/a | 1.33× | OK |
| PyPy 7.3tracing JIT | 10 | 496 µs | 89.1 ms | 93.1 ms | 1.45 ms | n/a | 0.18× | OK |
| tengobytecode VM | 10 | 372 µs | 1.71 s | 1.78 s | 34.1 ms | 3.07 GiB | 3.39× | OK |
| scriggobytecode VM | 0 | n/a | n/a | n/a | n/a | n/a | n/a | unsupported |
| mvmbytecode VM | 10 | 679 µs | 1.05 s | 1.08 s | 11.0 ms | 70 MiB | 2.08× | OK |
| yaegiAST walker | 10 | 812 µs | 1.76 s | 1.90 s | 103 ms | 74 MiB | 3.49× | 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
piko / Go
piko_source.gonative Go
native_main.goCPython / PyPy
cpython.pytengo
script.tengo