NeoSCAD

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 bench in 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: OPENSCADPATH points at BOSL2 (commit 9948313); each binary uses its own bundled fonts.

Machine and binaries

MachineMac16,7, Apple M4 Pro, 14 cores (10 performance + 4 efficiency), 48 GB, on AC power
OSmacOS 27.0 (26A428)
NeoSCAD0.1.1 (commit 7c4ebc0), cargo build --release, arm64
OpenSCAD nightly2026.09.23, universal binary, run with --backend=manifold and --backend=cgal
OpenSCAD 2021.01x86_64 only, so it runs under Rosetta 2 on this machine
MeasuredNeoSCAD: 30 September 2026, 15:07 UTC. OpenSCAD: cached from 27 and 28 September 2026

The chart

Bar chart of the table below on a log time scale: for each model, bars for NeoSCAD, the nightly with Manifold, the nightly with CGAL, and OpenSCAD 2021.01, with NeoSCAD's time and its speedup over the nightly with Manifold on the right. Geometric means at the bottom: nightly Manifold 4.73× over 14 models, nightly CGAL 31.45× over 12, OpenSCAD 2021.01 69.31× over 12.
Log time scale. Hatched bars are timeouts; a red mark means the mesh differs from NeoSCAD's (only OpenSCAD 2021.01's, on two models). The right-hand columns are NeoSCAD's time and its speedup over the nightly with Manifold.

Every result

Best of 3, in seconds; × is the reference's time divided by NeoSCAD's.

† OpenSCAD 2021.01's mesh differs from NeoSCAD's and the nightly's (extrude_twist: volume and area; text_30lines: bounding box). Geometric means over the 14 models: 4.726× against the nightly with Manifold (14 models), 31.451× against the nightly with CGAL (12 models; bosl_fractal_tree and csg_spheres time out) and 69.313× against OpenSCAD 2021.01 (12 models, the same two excluded).
Model NeoSCAD Nightly, Manifold × Nightly, CGAL × 2021.01 ×
bosl_fractal_tree
BOSL2 examples/fractal_tree.scad (recursive attach, depth 10)
0.61511.7319.07×timeout–timeout–
bosl_gears__003
BOSL2 gears.scad doc example 3: helical spur_gear
0.0460.2144.68×0.2254.93×0.4119.00×
bosl_isosurface__006
BOSL2 isosurface.scad doc example 6: metaballs sphere with connectors
0.6042.4714.09×2.5264.18×5.5019.11×
bosl_screws__001
BOSL2 screws.scad doc example 1: selected UTS screws
0.1640.6684.07×31.45191.43×70.91431.56×
bosl_spring_handle
BOSL2 examples/spring_handle.scad
0.2040.7293.58×13.2665.08×41.90205.70×
csg_deep_union
800 rotated/translated cubes, implicit top-level union
0.0400.1343.35×7.617190.44×20.33508.22×
csg_spheres
cube(60) minus 5x5x5 grid of spheres ($fn=48)
0.3961.1302.86×timeout–timeout–
ex_csg_basic
OpenSCAD examples/Basics/CSG.scad
0.0070.0629.04×1.127163.30×3.050442.04×
ex_menger
OpenSCAD examples/Old/example024.scad (Menger sponge, n=3)
0.1020.1601.56×15.19148.37×45.56444.97×
extrude_twist
linear_extrude(height=50, twist=720, slices=400) of square minus circle
0.0350.2186.25×0.2206.30×0.3279.36×
import_stl
import() of a 21 MB ASCII STL (sphere $fn=256) minus two cubes
0.1040.5445.21×10.1797.37×37.55359.35×
mink_convex
minkowski(cube([30,20,5],center=true), sphere(3,$fn=48))
0.0220.0743.42×0.1486.84×0.1024.72×
mink_nonconvex
minkowski(L of two cubes, sphere(2,$fn=24))
0.0100.0646.38×0.36136.07×0.90190.13×
text_30lines
linear_extrude(2) of 30 text() lines of 58 characters (Liberation Sans)
0.1130.6185.46×0.5925.23×1.33811.82×
cold_start
cube(1) to ASCII STL: process startup plus the smallest render (not in the geometric means)
0.00290.045515.69×0.046416.00×0.070124.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
bosl2
A BOSL2 part: rounded cuboid, chamfered cylinder and prismoid; the edit changes the cuboid's height
8.414.235.976.1163.0235.6
csg
OpenSCAD's examples/Basics/CSG.scad; the edit moves the difference (the third object)
1.06.37.131.460.0127.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_tree is 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/.