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 pipit | Status |
|---|---|---|---|---|---|---|---|---|
| Native Gocompiled | 7 | 108 ms | 61.9 ms | 62.7 ms | 600 µs | 1.62 GiB | 0.05× | OK |
| Pipitbytecode VM | 7 | 2.35 ms | 1.21 s | 1.24 s | 13.3 ms | 534 MiB | 1.00× | OK |
| CPython 3.14bytecode VM | 7 | 712 µs | 1.31 s | 1.32 s | 7.01 ms | n/a | 1.08× | OK |
| PyPy 7.3tracing JIT | 7 | 513 µs | 258 ms | 286 ms | 11.8 ms | n/a | 0.21× | OK |
| tengobytecode VM | 7 | 395 µs | 4.19 s | 4.24 s | 26.9 ms | 1.66 GiB | 3.45× | OK |
| scriggobytecode VM | 0 | n/a | n/a | n/a | n/a | n/a | n/a | unsupported |
| mvmbytecode VM | 7 | 712 µs | 4.21 s | 4.24 s | 21.7 ms | 1.68 GiB | 3.47× | OK |
| yaegiAST walker | 7 | 573 µs | 9.86 s | 9.93 s | 39.1 ms | 1.66 GiB | 8.12× | 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
pipit / Go
pipit_source.gonative Go
native_main.goCPython / PyPy
cpython.pytengo
script.tengo