-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Description
Recently I got some help from you guys to set up a way to run benchmarks to use different versions of the same DLL using WithCustomBuildConfiguration. This works pretty well. However, there's one gotcha that I don't understand: it appears to always use RyuJIT DEBUG.
It appears to have the effect that certain optimizations do not take place (which is not surprising if it is indeed the RyuJIT DEBUG running). However, I'm not 100% certain if this is just a flaw in the reporting, because when running each job separately (and then it shows just RyuJIT), the numbers are within error margin.
Anyway, this is the output I have:
// * Summary *
BenchmarkDotNet=v0.12.1, OS=Windows 7 SP1 (6.1.7601.0)
Intel Xeon CPU X5680 3.33GHz, 2 CPU, 12 logical and 12 physical cores
Frequency=3247138 Hz, Resolution=307.9635 ns, Timer=TSC
.NET Core SDK=3.1.400-preview-015151
[Host] : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT DEBUG
Before : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT
Optimized : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT DEBUG
MaxRelativeError=0.01 IterationTime=150.0000 ms WarmupCount=1
Note that for my "Optimized" job I would expect it to use the same 64 bit RyuJIT. This is the config that I use (with help from @adamsitnik, from here: #1486). It's F#, but you'll get the idea:
let baseJob = Job.Default
.WithWarmupCount(1) // 1 warmup is enough for our purpose
.WithIterationTime(TimeInterval.FromMilliseconds(250.0)) // the default is 0.5s per iteration
.WithMaxRelativeError(0.01)
let jobBefore = baseJob.WithId("Before").WithBaseline(true)
let jobAfter = baseJob.WithCustomBuildConfiguration("LocalBuild").WithId("Optimized")
let config = DefaultConfig.Instance.AddJob(jobBefore).AddJob(jobAfter).KeepBenchmarkFiles()
BenchmarkRunner.Run<BenchToString>(config)
|> ignore