Slang compile-time performance — complexity sweep

build v2026.12 · metric: median (ms) · 29 swept workload(s) · compile time vs workload size N, each curve a single binary scaled simple→complex.

Scaling curves (compileInner)

Each panel is one workload's compileInner vs N on a zero-based linear axis, flagged with the floor-subtracted exponent ∝Nk (red ⇒ super-linear, k>1.15). Click a workload name for its sub-counter stacked view, the full scaling analysis (floor 14 ms / k / top-2×), and the raw sweep numbers.

Complexity sweep — compileInner vs workload size N (median ms, linear) dashed = linear expectation: measured floor (the minimal workload) + slope fitted on the low-N half, extrapolated; the end-point label is actual/linear at max N (red when ≥1.15× — super-linear) complexity_ladder ∝N^1.45 0.0 2457 4915 160 320 640 1280 N 2.27× lin parse ∝N^1.17 0.0 196 391 250 500 1000 2000 N 1.23× lin diagnostics_clean ∝N^0.95 0.0 66 133 400 800 1600 3200 N 0.96× lin sema_generics ∝N^0.99 0.0 565 1130 125 250 500 1000 N 1.00× lin generic_nesting ∝N^12.94 0.0 844 1689 8 12 16 20 N 1779.83× lin generic_nesting_eval ∝N^14.92 0.0 505 1010 8 10 12 14 N 66.38× lin interface_depth ∝N^3.95 0.0 175 349 16 32 64 128 N conformance ∝N^1.18 0.0 278 555 600 1200 2400 4800 N 1.25× lin operator_typecheck ∝N^1.04 0.0 189 379 200 400 800 1600 N 1.07× lin implicit_conversion ∝N^1.02 0.0 226 453 300 600 1200 2400 N 1.05× lin overload_resolution ∝N^1.02 0.0 104 208 600 1200 2400 4800 N 1.02× lin ir_builder ∝N^1.82 0.0 716 1432 500 1000 2000 4000 N 3.71× lin serialize ∝N^1.22 0.0 213 426 375 750 1500 3000 N 1.46× lin module_link ∝N^1.18 0.0 265 529 50 100 200 400 N 1.41× lin specialization ∝N^1.44 0.0 357 714 75 150 300 600 N 2.14× lin dynamic_dispatch ∝N^1.45 0.0 532 1063 50 100 200 400 N 2.22× lin existential_aggregate ∝N^1.50 0.0 724 1448 50 100 200 400 N 2.52× lin autodiff ∝N^1.08 0.0 685 1371 25 50 100 200 N 1.32× lin inlining ∝N^1.84 0.0 1162 2325 100 200 400 800 N 4.33× lin loop_unroll ∝N^1.85 0.0 1047 2094 75 150 300 600 N 4.25× lin control_flow_ssa ∝N^1.42 0.0 955 1910 60 120 240 480 N 2.08× lin resource_aggregate ∝N^1.49 0.0 628 1255 80 160 320 640 N 2.33× lin reflection_layout ∝N^1.38 0.0 367 734 30 60 120 240 N 2.05× lin codegen_spirv ∝N^1.91 0.0 2040 4080 100 200 400 800 N 4.41× lin emit_metal ∝N^1.97 0.0 2567 5135 100 200 400 800 N 5.00× lin emit_wgsl ∝N^1.92 0.0 2156 4312 100 200 400 800 N 4.62× lin emit_hlsl ∝N^1.89 0.0 2183 4367 100 200 400 800 N 4.82× lin emit_glsl ∝N^1.83 0.0 1809 3618 100 200 400 800 N 4.20× lin emit_cuda ∝N^1.84 0.0 1635 3270 100 200 400 800 N 4.34× lin
Reading these: these synthetic workloads amplify one compiler pass each — the curve shape (the exponent k of the floor-subtracted fit (t − floor) = a·Nk), not the absolute ms, is the signal. k≈1 ⇒ cost is linear in code size; k>1 ⇒ a pass whose cost grows faster than its input, where regressions on large real shaders hide. The fixed floor is the minimal workload (subtracted before the fit, not refitted per workload), also the suite's standalone canary for "the stdlib got heavier". Per-workload pages carry the full analysis and numbers.

Generated by perf-suite/sweep_report.py from results/v2026.12/results.json. Companion to report.py (cross-release) and ladder_scaling.py (cross-release fit table).