3dtiled-to-3dtiles
Reference & Planning

Benchmarks

Reproducible conversion benchmark over the repo's own converters, and how it relates to the fastest-tiler ambition.

Why this exists

The TODO / Future work fastest-tiler research note flagged that no neutral benchmark existed — not against PotreeConverter 2.0 / untwine, and not even run-over-run against ourselves. This page is the first step: a pinned, reproducible harness measuring our own converters on fixed public datasets, so any performance change (e.g. wiring the WorkerPool multicore tier, or the WebP-instead-of-pngjs decode swap) has a before/after number.

Running it

node scripts/benchmark-converters.mjs            # all datasets
node scripts/benchmark-converters.mjs --only potree,rad

Sources are mirrored once into .bench-cache/ (download time reported separately and cached across runs), then the offline convert() is timed cold per run. Results print as a markdown table and are appended as dated JSON under benchmark-results/.

First results (2026-08-22)

Machine: 12th Gen Intel Core i7-12800H × 20 threads · Node v22.22.3 · Windows 11.

DatasetFormatSource MBConvert sOutput filesOutput MBThroughput
potree1-lion-takanawapotree4.90.752967.80.36 M points/s
potree2-lionpotree44.23.921741111.91.01 M points/s
sog-skateparksog174.421.142055165.88.3 MB/s
rad-tastier-500krad12.20.53129.90.94 M splats/s

Reading the numbers:

  • ~1 M points/s (Potree 2.0) on a single core (the WorkerPool tier isn't wired — see Performance) vs PotreeConverter 2.0's published ~9 M points/s for a different job: it builds an octree from raw unordered points; our converter transcodes an existing octree. The honest comparison for the fastest-tiler ambition is our future raw-input tiler vs PotreeConverter/untwine — this table is the regression baseline for the transcode path.
  • SOG is decode-bound (WebP → DataTable via WASM, then SPZ re-encode): 8.3 MB/s of source. This is the path with the most multicore headroom.
  • RAD is nearly free (0.53 s for 500 k splats) — column decode + SPZ encode, no image codecs.

External tilers (context, not apples-to-apples)

ToolJobTheir reported speed
PotreeConverter 2.0raw points → Potree octree~9 M pts/s uniform / ~6 M pts/s blue-noise (published paper)
untwineraw points → COPC2–5× faster than pdal translate past 500 M pts (own claim)
MIERUNE point-tilerLAS/LAZ/CSV → 3D Tiles 1.1Rust/Rayon; no published numbers — worth measuring

None of those transcode already-tiled formats (this repo's job today), and none of their numbers are third-party-verified — see the TODO doc's research note. When the raw-input tiler direction is scoped, these become the targets and this harness grows a raw-input track (same datasets as their READMEs use, e.g. Autzen / CA13).

On this page