Build dotnet/fsharp in Release, then lay fsc out the way the .NET SDK ships it: ReadyToRun via crossgen2 per assembly, and the SDK's fsc.runtimeconfig.json (Server GC).
Capture every fsc command line from one full dotnet build FSharp.Compiler.Service.slnx -c Release.
Replay each compilation in isolation (dotnet fsc.dll @rsp). Inputs are identical in every configuration, and outputs go to a scratch directory.
Interleave configurations. Every round runs all of them once, in shuffled order.
Record per run:
wall and CPU time and peak RSS
GC and JIT counters (startup hook)
compiler phases (--times)
host activity, flagging disturbed runs
Report medians, with a 95% bootstrap confidence interval (CI) on every change. A change counts as significant only when its CI excludes zero.
Do the flags behave differently on SDK 10 and SDK 11?
These are the compilers as shipped in each SDK, with no changes to SDK files, run on the same captured compilations.
The flags are set as env vars on the fsc process. Configs are interleaved in shuffled rounds.
Whole dotnet build
Metric grid
One row per compilation, one column per metric. In each cell, every selected config is a bar.
A bar is the median. The whisker is the interquartile range (q1 to q3). Bars start at zero.
Hover a bar for n, the quartiles, and the change vs the reference config with its 95% CI.