namespace AdventOfCode2022.App open System.Diagnostics open BenchmarkDotNet.Attributes open BenchmarkDotNet.Configs open BenchmarkDotNet.Running module Benchmarks = type Benchmark1To5 () = [] member _.Setup () = Run.shouldWrite <- false [] member val Day = 0 with get, set [] member val IsPartOne = false with get, set [] member this.Benchmark () : unit = Run.allRuns.[this.Day - 1] (not this.IsPartOne) (Inputs.day this.Day) [] member _.Cleanup () = Run.shouldWrite <- true type Benchmark6To10 () = [] member _.Setup () = Run.shouldWrite <- false [] member val Day = 0 with get, set [] member val IsPartOne = false with get, set [] member this.Benchmark () : unit = Run.allRuns.[this.Day - 1] (not this.IsPartOne) (Inputs.day this.Day) [] member _.Cleanup () = Run.shouldWrite <- true type Benchmark11To15 () = [] member _.Setup () = Run.shouldWrite <- false [] member val Day = 0 with get, set [] member val IsPartOne = false with get, set [] member this.Benchmark () : unit = Run.allRuns.[this.Day - 1] (not this.IsPartOne) (Inputs.day this.Day) [] member _.Cleanup () = Run.shouldWrite <- true type Benchmark16To20 () = [] member _.Setup () = Run.shouldWrite <- false [] member val Day = 0 with get, set [] member val IsPartOne = false with get, set [] member this.Benchmark () : unit = Run.allRuns.[this.Day - 1] (not this.IsPartOne) (Inputs.day this.Day) [] member _.Cleanup () = Run.shouldWrite <- true let finalBenchmarkArgs = (25, false) :: List.allPairs [ 21..24 ] [ false ; true ] type Benchmark21To25 () = [] member _.Setup () = Run.shouldWrite <- false [] member val Day = 0 with get, set [] member val IsPartOne = false with get, set [] [] member this.Benchmark () : unit = Run.allRuns.[this.Day - 1] (not this.IsPartOne) (Inputs.day this.Day) [] member _.Cleanup () = Run.shouldWrite <- true module Program = [] let main args = match args with | [| "bench" |] -> let config = ManualConfig .Create(DefaultConfig.Instance) .WithOptions ConfigOptions.DisableOptimizationsValidator let _summary = BenchmarkRunner.Run config let _summary = BenchmarkRunner.Run config let _summary = BenchmarkRunner.Run config let _summary = BenchmarkRunner.Run config let _summary = BenchmarkRunner.Run config 0 | _ -> let time = Stopwatch.StartNew () time.Restart () for day = 1 to Run.allRuns.Length do Run.allRuns.[day - 1] false (Inputs.day day) Run.allRuns.[day - 1] true (Inputs.day day) Run.day25 (Inputs.day 25) time.Stop () printfn $"Took %i{time.ElapsedMilliseconds}ms" 0