GroomLab

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

MeasureXGenGroomLabFollow ScalpNo CurlGPU previewGroomLab vs XGen
New groom to first drawn frame12.6 s0.49 s–––26× faster
Saved scene (.mb)114 MB2.23 MB–––51× smaller
Animated scalp, evaluation per frame414 ms166 ms28 ms––15× faster (Follow Scalp)
Alembic export, 24 frames18.1 s6.96 s3.53 s––5.1× faster (Follow Scalp)
Arnold .ass export, motion blur8.68 s1.6 s0.95 s––9.1× faster (Follow Scalp)
Memory after creation1,127 MB617 MB–––1.8× less
GPU memory, viewport958 MB486 MB–––2× less
Save the scene (.mb)2.25 s0.02 s–––113× faster
Open the scene and evaluate1.06 s0.22 s–––4.8× faster
Clump tweak, evaluated248 ms100 ms–66.3 ms–2.5× faster
Noise tweak, evaluated160 ms75.7 ms–49.3 ms–2.1× faster
Noise tweak to redrawn frame132 ms108 ms–81.4 ms–1.2× faster
Clump tweak to redrawn frame367 ms134 ms–98.6 ms–2.7× faster
Dragging the clump slider, to redrawn frame367 ms–––13.3 ms28× faster (GPU preview)
Dragging the noise slider, to redrawn frame132 ms–––12 ms11× faster (GPU preview)
Animated scalp playback (higher is better)1.52 fps4.92 fps16.4 fps––11× faster (Follow Scalp)
Orbiting the viewport (higher is better)124 fps241 fps–––1.9× faster
Brush dab while dragging, to redrawn frame–36.6 ms–31.6 ms5.14 ms–

100,000 strands

MeasureXGenGroomLabFollow ScalpNo CurlGPU previewGroomLab vs XGen
New groom to first drawn frame11.5 s0.2 s–––58× faster
Saved scene (.mb)24.4 MB2.23 MB–––11× smaller
Animated scalp, evaluation per frame128 ms40.7 ms8.15 ms––16× faster (Follow Scalp)
Alembic export, 24 frames4.73 s1.32 s0.59 s––8× faster (Follow Scalp)
Arnold .ass export, motion blur2.47 s0.42 s0.27 s––9.1× faster (Follow Scalp)
Memory after creation286 MB138 MB–––2.1× less
GPU memory, viewport190 MB99 MB–––1.9× less
Save the scene (.mb)0.63 s0.02 s–––32× faster
Open the scene and evaluate0.47 s0.09 s–––5.2× faster
Clump tweak, evaluated51 ms21.9 ms–15.3 ms–2.3× faster
Noise tweak, evaluated31.6 ms16.6 ms–11.6 ms–1.9× faster
Noise tweak to redrawn frame30.8 ms26.3 ms–20.1 ms–1.2× faster
Clump tweak to redrawn frame80.6 ms32 ms–24.1 ms–2.5× faster
Dragging the clump slider, to redrawn frame80.6 ms–––4.08 ms20× faster (GPU preview)
Dragging the noise slider, to redrawn frame30.8 ms–––3.5 ms8.8× faster (GPU preview)
Animated scalp playback (higher is better)5.18 fps20.5 fps56.3 fps––11× faster (Follow Scalp)
Orbiting the viewport (higher is better)557 fps280 fps–––XGen 2× faster
Brush dab while dragging, to redrawn frame–13.6 ms–11.9 ms3.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: mayapy for 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 xgmCreateSplineDescription with its clump and noise modifiers; GroomLab's create_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: .ass export 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.

On this page