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 pipit | Status |
|---|---|---|---|---|---|---|---|---|
| Native Gocompiled | 7 | 107 ms | 3.39 ms | 3.40 ms | 2.13 µs | 1.62 GiB | 0.14× | OK |
| Pipitbytecode VM | 7 | 906 µs | 24.5 ms | 25.0 ms | 246 µs | 591 MiB | 1.00× | OK |
| CPython 3.14bytecode VM | 7 | 312 µs | 146 ms | 155 ms | 3.12 ms | n/a | 5.98× | OK |
| PyPy 7.3tracing JIT | 7 | 243 µs | 13.1 ms | 13.8 ms | 681 µs | n/a | 0.54× | OK |
| tengobytecode VM | 7 | 191 µs | 228 ms | 237 ms | 5.14 ms | 1.69 GiB | 9.34× | OK |
| scriggobytecode VM | 7 | 201 µs | 201 ms | 203 ms | 1.71 ms | 1.69 GiB | 8.21× | OK |
| mvmbytecode VM | 7 | 270 µs | 189 ms | 192 ms | 1.53 ms | 1.69 GiB | 7.75× | OK |
| yaegiAST walker | 7 | 325 µs | 216 ms | 236 ms | 10.7 ms | 1.69 GiB | 8.83× | 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 pipit's typed float register bank pays its biggest dividend.
Source code
pipit / Go
pipit_source.gonative Go
native_main.goCPython / PyPy
cpython.pytengo
script.tengo