Mandelbrot (FP)
Escape-time render of the Mandelbrot set at 200×200 with 80 iters/pixel. Pure float64 tight loop.
Runtime · median per inner-loop window
Full statistics
| Runner | N | Compile | Runtime | P95 | Stddev | RSS | vs piko | Status |
|---|---|---|---|---|---|---|---|---|
| Native Gocompiled | 10 | 181 ms | 3.38 ms | 3.39 ms | 4.30 µs | 69 MiB | 0.12× | OK |
| Piko interpbytecode VM | 10 | 735 µs | 28.8 ms | 29.4 ms | 226 µs | 82 MiB | 1.00× | OK |
| CPython 3.13bytecode VM | 10 | 262 µs | 140 ms | 147 ms | 3.26 ms | n/a | 4.86× | OK |
| PyPy 7.3tracing JIT | 10 | 237 µs | 11.0 ms | 11.3 ms | 175 µs | n/a | 0.38× | OK |
| tengobytecode VM | 10 | 208 µs | 269 ms | 278 ms | 3.54 ms | 1.45 GiB | 9.36× | OK |
| scriggobytecode VM | 10 | 236 µs | 199 ms | 230 ms | 9.41 ms | 72 MiB | 6.93× | OK |
| mvmbytecode VM | 10 | 274 µs | 291 ms | 322 ms | 22.1 ms | 62 MiB | 10.1× | OK |
| yaegiAST walker | 10 | 304 µs | 237 ms | 266 ms | 15.0 ms | 66 MiB | 8.24× | OK |
Workload & symmetry rules
Workload
For each of 200×200 pixels: iterate the Mandelbrot recurrence z = z² + c up to 80 times, count the iteration at which |z| > 2. Output the sum of iteration counts so canonical hashing doesn't depend on FP equality.
Symmetry rules
- Pure
float64scalar arithmetic (nocomplextype, nonumpy, nomath.cmath). - Inner loop manually unrolled per the README's reference shape; no language-specific shortcuts.
Why this benchmark exists
The one shape of work missing from the rest of the suite: a tight float64 inner loop. This is where piko's typed float register bank pays its biggest dividend.
Source code
piko / Go
piko_source.gonative Go
native_main.goCPython / PyPy
cpython.pytengo
script.tengo