Performance
GroomLab against XGen Interactive Grooming, measured, with the method and the caveats.
GroomLab and Maya's XGen Interactive Grooming (Interactive Groom Splines) were timed side by side on
the same scalp and machine, at 100,000 and 500,000 strands. The harness that made these numbers is
in the GroomLab source (tools/bench/xgen_compare), so you can run it on your own hardware.
- Machine: AMD Threadripper PRO 5945WX (12 cores), 128 GB RAM, RTX 3090; Maya 2022, Windows 11.
- Setup: The same 17k-triangle head-sized scalp, strands 15 cm long with 16 points each, clumping and noise on both (GroomLab adds a Curl), every strand shown in the viewport.
- Runs: Medians of 5 runs for XGen and 3 for GroomLab, each measurement in a fresh Maya. XGen measured 2026-10-01, GroomLab 2026-10-02 (build 5e8bc26).
The short version
- Starting and saving. A new groom is ready in under a second where XGen takes about twelve, and a saved scene holds GroomLab's guides and graph, not its strands: a couple of MB at any count.
- Animation and exports. With Follow Scalp the groom grows once and the scalp carries it, so each frame of an animated scalp, an Alembic export and a motion-blurred Arnold export cost a fraction of XGen's.
- Grooming. A tweak redraws faster than XGen's at both counts, and its evaluation alone takes about half of XGen's. Dragging a slider or a brush previews on the GPU: about 12 ms to the redrawn frame at 500,000 strands, where XGen's tweak takes 132 ms; letting go commits on the CPU.
500,000 strands
| Measure | XGen | GroomLab | Follow Scalp | No Curl | GPU preview | GroomLab vs XGen |
|---|---|---|---|---|---|---|
| New groom to first drawn frame | 12.6 s | 0.49 s | – | – | – | 26× faster |
| Saved scene (.mb) | 114 MB | 2.23 MB | – | – | – | 51× smaller |
| Animated scalp, evaluation per frame | 414 ms | 166 ms | 28 ms | – | – | 15× faster (Follow Scalp) |
| Alembic export, 24 frames | 18.1 s | 6.96 s | 3.53 s | – | – | 5.1× faster (Follow Scalp) |
| Arnold .ass export, motion blur | 8.68 s | 1.6 s | 0.95 s | – | – | 9.1× faster (Follow Scalp) |
| Memory after creation | 1,127 MB | 617 MB | – | – | – | 1.8× less |
| GPU memory, viewport | 958 MB | 486 MB | – | – | – | 2× less |
| Save the scene (.mb) | 2.25 s | 0.02 s | – | – | – | 113× faster |
| Open the scene and evaluate | 1.06 s | 0.22 s | – | – | – | 4.8× faster |
| Clump tweak, evaluated | 248 ms | 100 ms | – | 66.3 ms | – | 2.5× faster |
| Noise tweak, evaluated | 160 ms | 75.7 ms | – | 49.3 ms | – | 2.1× faster |
| Noise tweak to redrawn frame | 132 ms | 108 ms | – | 81.4 ms | – | 1.2× faster |
| Clump tweak to redrawn frame | 367 ms | 134 ms | – | 98.6 ms | – | 2.7× faster |
| Dragging the clump slider, to redrawn frame | 367 ms | – | – | – | 13.3 ms | 28× faster (GPU preview) |
| Dragging the noise slider, to redrawn frame | 132 ms | – | – | – | 12 ms | 11× faster (GPU preview) |
| Animated scalp playback (higher is better) | 1.52 fps | 4.92 fps | 16.4 fps | – | – | 11× faster (Follow Scalp) |
| Orbiting the viewport (higher is better) | 124 fps | 241 fps | – | – | – | 1.9× faster |
| Brush dab while dragging, to redrawn frame | – | 36.6 ms | – | 31.6 ms | 5.14 ms | – |
100,000 strands
| Measure | XGen | GroomLab | Follow Scalp | No Curl | GPU preview | GroomLab vs XGen |
|---|---|---|---|---|---|---|
| New groom to first drawn frame | 11.5 s | 0.2 s | – | – | – | 58× faster |
| Saved scene (.mb) | 24.4 MB | 2.23 MB | – | – | – | 11× smaller |
| Animated scalp, evaluation per frame | 128 ms | 40.7 ms | 8.15 ms | – | – | 16× faster (Follow Scalp) |
| Alembic export, 24 frames | 4.73 s | 1.32 s | 0.59 s | – | – | 8× faster (Follow Scalp) |
| Arnold .ass export, motion blur | 2.47 s | 0.42 s | 0.27 s | – | – | 9.1× faster (Follow Scalp) |
| Memory after creation | 286 MB | 138 MB | – | – | – | 2.1× less |
| GPU memory, viewport | 190 MB | 99 MB | – | – | – | 1.9× less |
| Save the scene (.mb) | 0.63 s | 0.02 s | – | – | – | 32× faster |
| Open the scene and evaluate | 0.47 s | 0.09 s | – | – | – | 5.2× faster |
| Clump tweak, evaluated | 51 ms | 21.9 ms | – | 15.3 ms | – | 2.3× faster |
| Noise tweak, evaluated | 31.6 ms | 16.6 ms | – | 11.6 ms | – | 1.9× faster |
| Noise tweak to redrawn frame | 30.8 ms | 26.3 ms | – | 20.1 ms | – | 1.2× faster |
| Clump tweak to redrawn frame | 80.6 ms | 32 ms | – | 24.1 ms | – | 2.5× faster |
| Dragging the clump slider, to redrawn frame | 80.6 ms | – | – | – | 4.08 ms | 20× faster (GPU preview) |
| Dragging the noise slider, to redrawn frame | 30.8 ms | – | – | – | 3.5 ms | 8.8× faster (GPU preview) |
| Animated scalp playback (higher is better) | 5.18 fps | 20.5 fps | 56.3 fps | – | – | 11× faster (Follow Scalp) |
| Orbiting the viewport (higher is better) | 557 fps | 280 fps | – | – | – | XGen 2× faster |
| Brush dab while dragging, to redrawn frame | – | 13.6 ms | – | 11.9 ms | 3.44 ms | – |
Follow Scalp is GroomLab with Follow Scalp on, for the measures with an animated scalp. No Curl is the benchmark groom without its Curl node: the operators XGen runs here (clump and noise), for the closest like-for-like. GPU preview is GroomLab while a slider or brush is being dragged: the change draws from the GPU, and letting go commits it on the CPU (the drag's frame differs from the commit's in under 0.1% of pixels). Measured with Viewport 2.0 on OpenGL, as XGen was.
How it was measured
- Every measurement runs in a fresh Maya:
mayapyfor batch work (creation, tweaks, exports, per-frame evaluation without drawing), the Maya GUI for the viewport (the window pinned to 1600 x 1000, the perspective view alone, smooth shaded, default lighting). - Creation is from nothing to a fully evaluated groom (XGen's
xgmCreateSplineDescriptionwith its clump and noise modifiers; GroomLab'screate_groom, guides from curves and its graph). In the GUI, to the first drawn frame. - Tweaks change the clump strength or noise amplitude, then force an evaluation (batch) or a redraw (GUI).
- Animated scalp: a bend deformer keyed over 100 frames; per-frame evaluation, playback and exports over its frames.
- Arnold:
.assexport time, static and with 2-key motion blur. - Memory: the process's working set after creation; GPU memory is the whole device's change
(
nvidia-smi).
Caveats
- The two systems do different work. XGen's splines are each evaluated through its modifiers; GroomLab scatters strands, interpolates them from about 500 guides and runs its graph. Clump and noise algorithms and units differ, and GroomLab's clumps are tighter at the same strength.
- XGen 2022 has no per-strand curl, so the matched comparison is No Curl.
- XGen's brushes take only mouse events (they cannot be scripted), so brush timings are GroomLab's alone.
- XGen uses OpenCL in the GUI; GroomLab evaluates on the CPU, on every core.
Run it yourself
With a GroomLab build and Maya 2022 (and MtoA for the render part):
"C:/Program Files/Autodesk/Maya2022/bin/mayapy.exe" tools/bench/xgen_compare/run_bench.py --runs 5--counts, --parts batch,render,gui and --systems pick what runs; the results go to
tools/bench/xgen_compare/results/ as JSON and a Markdown table. A full run takes two to three
hours. The harness' README has every option.