Slang compile-time performance — complexity sweep

build v2026.13.1 · 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 11 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.22 0.0 1400 2800 160 320 640 1280 N 1.47× lin parse ∝N^1.12 0.0 195 389 250 500 1000 2000 N 1.16× lin diagnostics_clean ∝N^0.93 0.0 68 136 400 800 1600 3200 N 0.94× lin sema_generics ∝N^0.96 0.0 479 957 125 250 500 1000 N 0.98× lin generic_nesting ∝N^12.79 0.0 842 1683 8 12 16 20 N 426.08× lin generic_nesting_eval ∝N^14.09 0.0 510 1021 8 10 12 14 N 63.82× lin interface_depth ∝N^3.75 0.0 175 350 16 32 64 128 N conformance ∝N^1.14 0.0 280 560 600 1200 2400 4800 N 1.22× lin operator_typecheck ∝N^1.01 0.0 189 377 200 400 800 1600 N 1.04× lin implicit_conversion ∝N^1.00 0.0 226 451 300 600 1200 2400 N 1.00× lin overload_resolution ∝N^0.94 0.0 112 224 600 1200 2400 4800 N 0.92× lin ir_builder ∝N^0.93 0.0 36 71 500 1000 2000 4000 N 0.98× lin serialize ∝N^1.10 0.0 182 365 375 750 1500 3000 N 1.23× lin module_link ∝N^1.06 0.0 226 452 50 100 200 400 N 1.07× lin specialization ∝N^1.19 0.0 186 372 75 150 300 600 N 1.42× lin dynamic_dispatch ∝N^0.96 0.0 159 317 50 100 200 400 N 1.01× lin existential_aggregate ∝N^1.13 0.0 252 503 50 100 200 400 N 1.38× lin autodiff ∝N^0.92 0.0 487 974 25 50 100 200 N 0.96× lin inlining ∝N^0.95 0.0 115 230 100 200 400 800 N 1.00× lin loop_unroll ∝N^1.71 0.0 610 1221 75 150 300 600 N 3.64× lin control_flow_ssa ∝N^1.43 0.0 864 1728 60 120 240 480 N 2.11× lin resource_aggregate ∝N^0.99 0.0 176 352 80 160 320 640 N 1.01× lin reflection_layout ∝N^1.30 0.0 287 574 30 60 120 240 N 1.76× lin codegen_spirv ∝N^1.65 0.0 699 1399 100 200 400 800 N 3.23× lin emit_metal ∝N^1.66 0.0 659 1318 100 200 400 800 N 3.18× lin emit_wgsl ∝N^1.67 0.0 660 1320 100 200 400 800 N 3.29× lin emit_hlsl ∝N^1.68 0.0 649 1297 100 200 400 800 N 3.29× lin emit_glsl ∝N^1.65 0.0 650 1299 100 200 400 800 N 3.14× lin emit_cuda ∝N^1.57 0.0 498 996 100 200 400 800 N 2.81× 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.13.1/results.json. Companion to report.py (cross-release) and ladder_scaling.py (cross-release fit table).