Slang compile-time performance — complexity sweep

build v2026.13 · 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 10 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.39 0.0 2170 4340 160 320 640 1280 N 2.00× lin parse ∝N^1.12 0.0 195 390 250 500 1000 2000 N 1.17× lin diagnostics_clean ∝N^0.95 0.0 67 134 400 800 1600 3200 N 0.95× lin sema_generics ∝N^0.97 0.0 483 966 125 250 500 1000 N 0.98× lin generic_nesting ∝N^12.68 0.0 834 1669 8 12 16 20 N 395.01× lin generic_nesting_eval ∝N^13.91 0.0 519 1038 8 10 12 14 N 62.50× lin interface_depth ∝N^3.75 0.0 175 350 16 32 64 128 N conformance ∝N^1.14 0.0 280 561 600 1200 2400 4800 N 1.22× lin operator_typecheck ∝N^1.02 0.0 193 387 200 400 800 1600 N 1.06× lin implicit_conversion ∝N^1.00 0.0 225 450 300 600 1200 2400 N 1.01× lin overload_resolution ∝N^0.95 0.0 109 219 600 1200 2400 4800 N 0.94× lin ir_builder ∝N^1.87 0.0 702 1404 500 1000 2000 4000 N 3.92× lin serialize ∝N^1.18 0.0 219 439 375 750 1500 3000 N 1.43× lin module_link ∝N^1.14 0.0 272 544 50 100 200 400 N 1.29× lin specialization ∝N^1.38 0.0 293 586 75 150 300 600 N 2.00× lin dynamic_dispatch ∝N^0.99 0.0 173 346 50 100 200 400 N 1.08× lin existential_aggregate ∝N^1.16 0.0 263 526 50 100 200 400 N 1.43× lin autodiff ∝N^1.01 0.0 557 1114 25 50 100 200 N 1.11× lin inlining ∝N^1.83 0.0 1163 2326 100 200 400 800 N 4.33× lin loop_unroll ∝N^1.82 0.0 988 1976 75 150 300 600 N 3.97× lin control_flow_ssa ∝N^1.44 0.0 890 1779 60 120 240 480 N 2.15× lin resource_aggregate ∝N^1.55 0.0 662 1324 80 160 320 640 N 2.54× lin reflection_layout ∝N^1.40 0.0 368 735 30 60 120 240 N 2.10× lin codegen_spirv ∝N^1.89 0.0 2035 4070 100 200 400 800 N 4.33× lin emit_metal ∝N^1.93 0.0 2357 4714 100 200 400 800 N 4.56× lin emit_wgsl ∝N^1.90 0.0 1856 3712 100 200 400 800 N 4.38× lin emit_hlsl ∝N^1.89 0.0 1781 3563 100 200 400 800 N 4.33× lin emit_glsl ∝N^1.93 0.0 1792 3584 100 200 400 800 N 4.74× lin emit_cuda ∝N^1.80 0.0 1521 3043 100 200 400 800 N 4.02× 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/results.json. Companion to report.py (cross-release) and ladder_scaling.py (cross-release fit table).