[{"data":1,"prerenderedAt":359},["ShallowReactive",2],{"algo-benchmarking-mesh-boolean-libraries-2026":3},{"id":4,"title":5,"author":6,"body":7,"date":327,"description":328,"extension":329,"keywords":330,"meta":346,"navigation":347,"path":348,"published":347,"seo":349,"stem":351,"tags":352,"__hash__":358},"algorithms\u002Falgorithms\u002Fbenchmarking-mesh-boolean-libraries-2026.md","Mesh Boolean Library Comparison and Benchmarks at Industry Scale — 2026","Žiga Sajovic",{"type":8,"value":9,"toc":313},"minimark",[10,28,31,34,41,47,69,73,78,166,170,173,179,196,202,206,209,216,222,227,230,234,237,240,246,250,253,257,266,272,276,279,283,286,309],[11,12,13],"note",{},[14,15,16,17,22,23,27],"p",{},"Part of a series on the same Thingi10K corpus, also measured ",[18,19,21],"a",{"href":20},"\u002Falgorithms\u002Fpython-mesh-boolean-libraries-2026","in Python"," and ",[18,24,26],{"href":25},"\u002Falgorithms\u002Fbrowser-mesh-boolean-libraries-2026","in the browser",".",[14,29,30],{},"Engineering — finite element analysis, simulation, geomodeling, CAD, additive manufacturing — runs mesh booleans at scale. At 100K to 1M triangles per operand, library timings spread two orders of magnitude.",[14,32,33],{},"Eight mesh boolean libraries on the Thingi10K corpus across three operations: pairwise, N-ary, and in-browser. Each library in its as-shipped, multi-threaded, optimized build. Timings are arrays-in to arrays-out — the cost a user actually pays.",[35,36],"corpus-grid",{":columns":37,":images":38,"detail":39,"title":40},"5","[\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0184.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0096.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0998.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0715.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0404.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0464.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0846.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0060.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0444.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0506.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0573.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0049.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0226.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0963.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0879.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0307.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0931.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0381.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0061.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0548.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0246.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0074.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0596.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0950.png\",\"\u002Fimg\u002Falgorithms\u002Fcorpus\u002Fthumb_0370.png\"]","25 of 1,000 Thingi10K pairs · 200K–1.5M polygons · two operands overlaid","The corpus",[14,42,43],{},[44,45,46],"strong",{},"On this corpus, trueform is the fastest mesh boolean library tested.",[48,49,50,57,63],"ul",{},[51,52,53,56],"li",{},[44,54,55],{},"Pairwise"," — 15.7 ms median, fastest on every pair of the 1000-pair corpus. 5.5× MeshLib, 7.5× Manifold, 9.2× Solidean, 27× Cherchi, 31× CGAL, 105× Geogram (geometric mean).",[51,58,59,62],{},[44,60,61],{},"N-ary at N=64"," — 103 ms median. 14× Solidean and Manifold, 44× Cherchi, 138× MeshLib, 536× CGAL, 648× Geogram.",[51,64,65,68],{},[44,66,67],{},"In-browser"," — 21.9 ms WebAssembly median, 12.6× Manifold WASM. Faster than any prior method runs natively.",[70,71],"article-cta",{":buttons":72},"[{\"label\":\"trueform\",\"to\":\"\u002Ftrueform\",\"icon\":\"i-lucide-cpu\",\"variant\":\"soft\",\"color\":\"neutral\"},{\"label\":\"Try it live\",\"to\":\"https:\u002F\u002Ftrueform.polydera.com\u002Flive-examples\u002Fboolean\",\"icon\":\"i-lucide-play\",\"variant\":\"soft\",\"color\":\"neutral\"},{\"label\":\"GitHub\",\"to\":\"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform\",\"icon\":\"i-simple-icons-github\",\"variant\":\"soft\",\"color\":\"neutral\"},{\"label\":\"Lunar\",\"to\":\"\u002Flunar\",\"icon\":\"i-lucide-moon\",\"variant\":\"soft\",\"color\":\"neutral\"}]",[74,75,77],"h2",{"id":76},"libraries-tested","Libraries tested",[48,79,80,92,103,113,124,135,145,156],{},[51,81,82,91],{},[44,83,84,90],{},[18,85,89],{"href":86,"rel":87},"https:\u002F\u002Fgithub.com\u002FBrunoLevy\u002Fgeogram",[88],"nofollow","Geogram"," 1.10"," — Exact predicates and constructions via multi-precision floats.",[51,93,94,102],{},[44,95,96,101],{},[18,97,100],{"href":98,"rel":99},"https:\u002F\u002Fwww.cgal.org\u002F",[88],"CGAL"," 6.1"," (EPICK, corefinement) — Exact predicates with inexact constructions.",[51,104,105,112],{},[44,106,107],{},[18,108,111],{"href":109,"rel":110},"https:\u002F\u002Fgithub.com\u002Fgcherchi\u002FFastAndRobustMeshArrangements",[88],"Cherchi et al."," (reference implementation) — Exact arrangement via indirect predicates.",[51,114,115,123],{},[44,116,117,122],{},[18,118,121],{"href":119,"rel":120},"https:\u002F\u002Fmeshlib.io\u002F",[88],"MeshLib"," 3.1"," — Simulation of Simplicity for degeneracy handling.",[51,125,126,134],{},[44,127,128,133],{},[18,129,132],{"href":130,"rel":131},"https:\u002F\u002Fgithub.com\u002Felalish\u002Fmanifold",[88],"Manifold"," 3.5"," — Deterministic floating point with symbolic perturbation. Ships native and WebAssembly.",[51,136,137,144],{},[44,138,139],{},[18,140,143],{"href":141,"rel":142},"https:\u002F\u002Fsolidean.com\u002F",[88],"Solidean"," (Community 2026-04-07-be517c) — Exact constructions via octree-embedded BSP. Specialized for iterated CSG.",[51,146,147,155],{},[44,148,149,154],{},[18,150,153],{"href":151,"rel":152},"https:\u002F\u002Fgithub.com\u002Fgkjohnson\u002Fthree-bvh-csg",[88],"three-bvh-csg"," 0.0.17"," — BVH-based CSG evaluator for three.js. Browser only.",[51,157,158,165],{},[44,159,160,164],{},[18,161,163],{"href":162},"\u002Ftrueform","trueform"," 0.9.8"," — Topologically-exact arrangements via a bounded integer kernel. Ships native and WebAssembly.",[74,167,169],{"id":168},"protocol","Protocol",[14,171,172],{},"Each method is timed from input arrays (vertices, triangles) to output arrays of the same shape. Import, internal structures, the boolean, output emission — all in the timer. Only file I\u002FO is outside. No amortisation: every structure rebuilt on every operation.",[14,174,175,178],{},[44,176,177],{},"Result agreement."," All libraries computed the same solid. Signed volumes and surface areas agree within floating-point tolerance on every pair. The comparison is wall-clock only. (One exception in the browser case, noted there.)",[14,180,181,184,185,190,191,27],{},[44,182,183],{},"Corpus."," Random sets of solid, manifold, non-self-intersecting Thingi10K meshes, 100K to 1M triangles per operand. Each operand is normalised to unit extent. For each pair (or N-tuple), 10 configurations are generated — independent random rotations per operand, then translations chosen so the bounding boxes overlap. Each pairwise case is assigned a random union, intersection, or difference; the N-ary sweep takes their union. Thingi10K IDs and per-operand triangle counts for every case are published: ",[18,186,189],{"href":187,"rel":188},"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform\u002Fblob\u002Fmain\u002Fresearch\u002Funcertainty-aware-mesh-csg\u002Fdata\u002Fpairwise-corpus-ids.json",[88],"pairwise corpus",", ",[18,192,195],{"href":193,"rel":194},"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform\u002Fblob\u002Fmain\u002Fresearch\u002Funcertainty-aware-mesh-csg\u002Fdata\u002Fnary-corpus-ids.json",[88],"N-ary corpus",[14,197,198,201],{},[44,199,200],{},"Hardware."," Apple M4 Max, 16 threads, macOS. Native builds compiled with the default release flags from each library's build system. Browser runs in Chrome 148 on the same machine.",[74,203,205],{"id":204},"pairwise-booleans","Pairwise booleans",[14,207,208],{},"One boolean per pair across the 1000-pair corpus. trueform is fastest on every one of them.",[14,210,211],{},[212,213],"img",{"alt":214,"src":215},"Pairwise mesh boolean benchmark","\u002Fimg\u002Falgorithms\u002Fbenchmark-pairwise-2026.png",[217,218],"data-table",{":headers":219,":highlight":220,":rows":221},"[\"library\",\"median (ms)\",\"geomean × vs trueform\"]","0","[[\"trueform 0.9.8\",\"15.7\",\"1.0×\"],[\"MeshLib 3.1\",\"86.4\",\"5.5×\"],[\"Manifold 3.5\",\"118.0\",\"7.5×\"],[\"Solidean 2026-04-07\",\"143.8\",\"9.2×\"],[\"Cherchi (ref)\",\"416.9\",\"26.5×\"],[\"CGAL 6.1\",\"493.2\",\"31.4×\"],[\"Geogram 1.10\",\"1,644.3\",\"104.7×\"]]",[223,224,226],"h3",{"id":225},"cgals-tail","CGAL's tail",[14,228,229],{},"CGAL's corefinement can degenerate super-polynomially on near-degenerate contacts. On one pair (Thingi10K models 844209 and 518083, 0.86M input triangles), CGAL ran for over five hours of CPU on a single core; trueform returned the same result in 20 ms. Operations are capped at 120 s; this pair is excluded from CGAL's distribution.",[74,231,233],{"id":232},"n-ary-booleans","N-ary booleans",[14,235,236],{},"For trueform, an N-ary boolean is one arrangement over all N operands. The native N-ary engines (Manifold, Cherchi, Geogram) arrange all operands at once. The others chain N-1 pairwise booleans, keeping their result in their own representation across the chain and emitting arrays once at the end.",[14,238,239],{},"40 random N-operand sets at each N ∈ {4, 16, 64}, each operand rotated and placed in an overlapping cluster. Vertical axis is log scale — a constant visual gap is an order-of-magnitude factor.",[14,241,242],{},[212,243],{"alt":244,"src":245},"N-ary mesh boolean benchmark (log scale)","\u002Fimg\u002Falgorithms\u002Fbenchmark-nary-2026.png",[217,247],{":headers":248,":highlight":220,":rows":249},"[\"method\",\"N=4 (ms)\",\"N=16 (ms)\",\"N=64 (ms)\",\"N=64 × vs trueform\"]","[[\"trueform 0.9.8\",\"6\",\"25\",\"103\",\"1.0×\"],[\"Solidean 2026-04-07\",\"61\",\"352\",\"1,429\",\"13.9×\"],[\"Manifold 3.5\",\"71\",\"354\",\"1,467\",\"14.3×\"],[\"Cherchi (ref)\",\"310\",\"1,711\",\"4,495\",\"43.7×\"],[\"MeshLib 3.1\",\"234\",\"1,134\",\"14,158\",\"137.7×\"],[\"CGAL 6.1\",\"246\",\"3,767\",\"55,100\",\"535.8×\"],[\"Geogram 1.10\",\"688\",\"5,265\",\"66,637\",\"647.9×\"]]",[14,251,252],{},"Solidean, Manifold, and Cherchi stay near a fixed factor as N grows. MeshLib, CGAL, and Geogram climb with the chain — MeshLib re-imports a growing materialised mesh at every step, CGAL's exact predicates degrade with operand count, and Geogram's exact arithmetic blows up with combined complexity.",[74,254,256],{"id":255},"in-browser-csg","In-browser CSG",[14,258,259,260,265],{},"The WebAssembly build runs the same pipeline client-side — ",[18,261,264],{"href":262,"rel":263},"https:\u002F\u002Ftrueform.polydera.com\u002Flive-examples\u002Fboolean",[88],"try it live",". Compared against Manifold's WebAssembly build and three-bvh-csg, the BVH-based CSG evaluator for three.js, on the pairwise corpus.",[14,267,268],{},[212,269],{"alt":270,"src":271},"In-browser mesh boolean benchmark","\u002Fimg\u002Falgorithms\u002Fbenchmark-browser-2026.png",[217,273],{":headers":274,":highlight":220,":rows":275},"[\"library\",\"median (ms)\",\"geomean × vs trueform\",\"notes\"]","[[\"trueform 0.9.8\",\"21.9\",\"1.0×\",\"—\"],[\"Manifold 3.5\",\"303.4\",\"12.6×\",\"—\"],[\"three-bvh-csg 0.0.17\",\"978\",\"41.2×\",\"watertight on only 22\u002F1000\"]]",[14,277,278],{},"WebAssembly costs trueform about 1.4× over native (15.7 ms to 21.9 ms). At 21.9 ms median, trueform in the browser is still faster than every prior method runs natively; MeshLib's native median is 86 ms.",[223,280,282],{"id":281},"three-bvh-csg-correctness","three-bvh-csg correctness",[14,284,285],{},"three-bvh-csg struggles with correctness at this scale. On 978 of 1000 pairs it returns an open mesh rather than a closed, manifold solid, and is watertight on only 22. It is attempting the same boolean as the others, with less robustness; the 41.2× figure is wall-clock against those runs.",[14,287,288,290,291,290,295,290,299,290,304],{},[18,289,163],{"href":162}," · ",[18,292,294],{"href":262,"rel":293},[88],"Try it live",[18,296,298],{"href":297},"\u002Flunar","Lunar",[18,300,303],{"href":301,"rel":302},"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform",[88],"GitHub",[18,305,308],{"href":306,"rel":307},"https:\u002F\u002Ftrueform.polydera.com",[88],"Documentation",[310,311],"cite-as",{"author":312,"title":5},"Sajovic, {\\v{Z}}iga",{"title":314,"searchDepth":315,"depth":315,"links":316},"",2,[317,318,319,323,324],{"id":76,"depth":315,"text":77},{"id":168,"depth":315,"text":169},{"id":204,"depth":315,"text":205,"children":320},[321],{"id":225,"depth":322,"text":226},3,{"id":232,"depth":315,"text":233},{"id":255,"depth":315,"text":256,"children":325},[326],{"id":281,"depth":322,"text":282},"2026-06-22","Eight mesh boolean libraries on the Thingi10K corpus at 100K–1M triangles per operand. trueform is the fastest tested: pairwise 5.5–105× geomean, N-ary at N=64 14–648×, in-browser 12.6× over Manifold WASM.","md",[331,332,333,334,335,336,337,338,339,340,341,342,343,344,345],"mesh boolean benchmark","fastest mesh boolean library","CSG library comparison","mesh boolean comparison 2026","fast mesh boolean","exact mesh boolean","CGAL alternative","Geogram alternative","Manifold alternative","MeshLib alternative","Solidean benchmark","Cherchi mesh booleans","in-browser CSG","WebAssembly mesh boolean","three-bvh-csg alternative",{},true,"\u002Falgorithms\u002Fbenchmarking-mesh-boolean-libraries-2026",{"title":350,"description":328},"Mesh Boolean Library Comparison and Benchmarks — 2026","algorithms\u002Fbenchmarking-mesh-boolean-libraries-2026",[353,354,355,356,357],"csg","booleans","benchmarks","performance","comparison","8qUorKkNaKWxX-Kcf0AsTk7DUS20PlRSF7sp8aaECi8",1786950767800]