Expression evaluator
Tokenise then evaluate 10,000 arithmetic expressions (mixed +, -, *, /, parens).
Runtime · median per inner-loop window
Full statistics
| Runner | N | Compile | Runtime | P95 | Stddev | RSS | vs piko | Status |
|---|---|---|---|---|---|---|---|---|
| Native Gocompiled | 10 | 180 ms | 76.5 ms | 78.1 ms | 1.51 ms | 145 MiB | 0.04× | OK |
| Piko interpbytecode VM | 10 | 2.46 ms | 2.15 s | 2.35 s | 65.0 ms | 2.88 GiB | 1.00× | OK |
| CPython 3.13bytecode VM | 10 | 572 µs | 1.43 s | 1.46 s | 26.2 ms | n/a | 0.66× | OK |
| PyPy 7.3tracing JIT | 10 | 467 µs | 221 ms | 258 ms | 11.6 ms | n/a | 0.10× | OK |
| tengobytecode VM | 10 | 387 µs | 4.36 s | 4.42 s | 47.6 ms | 2.19 GiB | 2.02× | OK |
| scriggobytecode VM | 0 | n/a | n/a | n/a | n/a | n/a | n/a | unsupported |
| mvmbytecode VM | 10 | 752 µs | 5.21 s | 5.32 s | 71.2 ms | 66 MiB | 2.42× | OK |
| yaegiAST walker | 10 | 730 µs | 12.8 s | 13.1 s | 190 ms | 67 MiB | 5.93× | OK |
Workload & symmetry rules
Workload
For each of 10,000 randomly-generated infix expressions: tokenise with a byte-loop lexer, parse via shunting-yard, evaluate over an integer stack.
Symmetry rules
- Bring-your-own tokeniser, parser, evaluator. No
eval(), no AST library. - Operands are 64-bit integers; division is integer division.
Source code
piko / Go
piko_source.gonative Go
native_main.goCPython / PyPy
cpython.pytengo
script.tengo