Benchmarks
How fast, measured how
NeoSCAD is about 3.6× faster than the OpenSCAD nightly (Manifold) on heavy models; 4.7× geometric mean over 14 models including startup. Here is the run behind those numbers, and what they leave out.
Those are one machine's numbers. For others, see
results from other machines, timed by
NeoSCAD's users with neoscad bench.
Method
- What is timed: the wall time of
<binary> [--backend=…] -o out.stl model.scad, a full render to ASCII STL, including process startup. - Runs: one binary after another, never in parallel; the best of 3 (one run once a run takes over 60 s); a 300 s timeout per run.
- Tool:
conformance benchin the NeoSCAD repository, which records the machine, the binaries' versions and SHA-256s, and every run. - Correctness: each model's mesh is compared with NeoSCAD's (volume, area within 0.1%, bounding box). Every model agrees with the nightly.
- Cached references: NeoSCAD is measured on every run. OpenSCAD's times come from a cache measured earlier on the same machine (27 September 2026; the BOSL2 test-suite time, 28 September) with the same binary (pinned by SHA-256), model, method and environment, so they aren't interleaved with NeoSCAD's runs.
- Timeouts: excluded from the geometric means. The nightly with CGAL and OpenSCAD 2021.01 time out on two models, so their means cover 12 models, which understates NeoSCAD's lead over them.
- Libraries and fonts:
OPENSCADPATHpoints at BOSL2 (commit9948313); each binary uses its own bundled fonts.
Machine and binaries
| Machine | Mac16,7, Apple M4 Pro, 14 cores (10 performance + 4 efficiency), 48 GB, on AC power |
|---|---|
| OS | macOS 27.0 (26A428) |
| NeoSCAD | 0.1.1 (commit 7c4ebc0), cargo build --release, arm64 |
| OpenSCAD nightly | 2026.09.23, universal binary, run with --backend=manifold and --backend=cgal |
| OpenSCAD 2021.01 | x86_64 only, so it runs under Rosetta 2 on this machine |
| Measured | NeoSCAD: 30 September 2026, 15:07 UTC. OpenSCAD: cached from 27 and 28 September 2026 |
Every result
Best of 3, in seconds; × is the reference's time divided by NeoSCAD's.
| Model | NeoSCAD | Nightly, Manifold | × | Nightly, CGAL | × | 2021.01 | × |
|---|---|---|---|---|---|---|---|
bosl_fractal_treeBOSL2 examples/fractal_tree.scad (recursive attach, depth 10) | 0.615 | 11.73 | 19.07× | timeout | – | timeout | – |
bosl_gears__003BOSL2 gears.scad doc example 3: helical spur_gear | 0.046 | 0.214 | 4.68× | 0.225 | 4.93× | 0.411 | 9.00× |
bosl_isosurface__006BOSL2 isosurface.scad doc example 6: metaballs sphere with connectors | 0.604 | 2.471 | 4.09× | 2.526 | 4.18× | 5.501 | 9.11× |
bosl_screws__001BOSL2 screws.scad doc example 1: selected UTS screws | 0.164 | 0.668 | 4.07× | 31.45 | 191.43× | 70.91 | 431.56× |
bosl_spring_handleBOSL2 examples/spring_handle.scad | 0.204 | 0.729 | 3.58× | 13.26 | 65.08× | 41.90 | 205.70× |
csg_deep_union800 rotated/translated cubes, implicit top-level union | 0.040 | 0.134 | 3.35× | 7.617 | 190.44× | 20.33 | 508.22× |
csg_spherescube(60) minus 5x5x5 grid of spheres ($fn=48) | 0.396 | 1.130 | 2.86× | timeout | – | timeout | – |
ex_csg_basicOpenSCAD examples/Basics/CSG.scad | 0.007 | 0.062 | 9.04× | 1.127 | 163.30× | 3.050 | 442.04× |
ex_mengerOpenSCAD examples/Old/example024.scad (Menger sponge, n=3) | 0.102 | 0.160 | 1.56× | 15.19 | 148.37× | 45.56 | 444.97× |
extrude_twist linear_extrude(height=50, twist=720, slices=400) of square minus circle | 0.035 | 0.218 | 6.25× | 0.220 | 6.30× | 0.327 | 9.36× |
import_stlimport() of a 21 MB ASCII STL (sphere $fn=256) minus two cubes | 0.104 | 0.544 | 5.21× | 10.17 | 97.37× | 37.55 | 359.35× |
mink_convexminkowski(cube([30,20,5],center=true), sphere(3,$fn=48)) | 0.022 | 0.074 | 3.42× | 0.148 | 6.84× | 0.102 | 4.72× |
mink_nonconvexminkowski(L of two cubes, sphere(2,$fn=24)) | 0.010 | 0.064 | 6.38× | 0.361 | 36.07× | 0.901 | 90.13× |
text_30lines linear_extrude(2) of 30 text() lines of 58 characters (Liberation Sans) | 0.113 | 0.618 | 5.46× | 0.592 | 5.23× | 1.338 | 11.82× |
cold_startcube(1) to ASCII STL: process startup plus the smallest render (not in the geometric means) | 0.0029 | 0.0455 | 15.69× | 0.0464 | 16.00× | 0.0701 | 24.17× |
The edit loop
An agent or a person edits one line and looks again. Each edit gives the line a new value, so no cached whole model answers it. Best of 10 edits, in milliseconds, from the same run. The nightly has no server mode, so it starts cold each time, exporting STL or a 1024×1024 rendered PNG.
| Case | Warm serve: render |
Warm serve: snapshot |
CLI, no server: STL | CLI, no server: snapshot | Nightly: STL | Nightly: PNG |
|---|---|---|---|---|---|---|
bosl2A BOSL2 part: rounded cuboid, chamfered cylinder and prismoid; the edit changes the cuboid's height | 8.4 | 14.2 | 35.9 | 76.1 | 163.0 | 235.6 |
csgOpenSCAD's examples/Basics/CSG.scad; the edit moves the difference (the third object) | 1.0 | 6.3 | 7.1 | 31.4 | 60.0 | 127.9 |
On a heavier model the edit time depends on what the edit touches. On the
gearbox on the home page, in a warm neoscad serve, an edit to
the planet carrier re-renders in 0.25 to 0.27 s; an edit to the plinth
takes 1.55 s, because its isosurface is evaluated again. So: an edit to one
part re-renders in about 0.25 s, not every edit.
Evaluation only: BOSL2's test suite
BOSL2's 976 tests, one process per test, run one after another and
written to .echo, with no geometry: NeoSCAD takes
29.6 s and the nightly 145.7 s. Both
pass all 976.
Caveats
- The 4.7× is mostly small models. 8 of the 14 finish
in under 0.11 s in NeoSCAD, where process startup counts for a lot
(2.9 ms for NeoSCAD against 45.5 ms for the nightly). Subtract startup
and the geometric mean is 3.63×; over the three models that take over
0.3 s it is 6.06×. One model lifts both:
bosl_fractal_treeis 19×, and without it the startup-subtracted mean is 3.19×. The gearbox on the home page is 2.80× (2.09 s against 5.85 s; re-timed on 30 September, 2.03 s against 6.04 s). That is why we say "about 3.6× on heavy models", and why a given heavy model may see less. - We know of no model where NeoSCAD is slower, but we
have only measured so many. The ones earlier builds were slower on,
which this set doesn't include, are now faster (one run each): the
Menger sponge at level 4 (1.40 s against the nightly's 2.03 s), 200
lines of
text()as 2D exported to SVG (0.47 s against 1.34 s), and the same 200 lines extruded to 3D (2.65 s against 32.38 s). If you find a slower one, please open an issue. - One machine. An Apple M4 Pro, arm64, with a load average of 2.8 to 3.2 while NeoSCAD was measured. Other machines, and x86_64 in particular, haven't been measured here; users' own runs are collected in results from other machines.
- The references weren't interleaved. OpenSCAD's times are from a cache measured earlier with the same binary, not alternated with NeoSCAD's runs.
- OpenSCAD 2021.01 runs under Rosetta 2 on this machine, and is five years older than the nightly. It is here as a reference series only; compare against the nightly with Manifold.
- The browser build will be slower. WebAssembly runs single-threaded, and these numbers don't apply to it.
Reproduce it
In a clone of the repository,
build with cargo build --release,
then run ./target/release/conformance bench. It writes a JSON
record and a chart like the ones here to progress/bench/.