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 type Benchmark21To25 () = static member finalBenchmarkArgs = (25, true) :: List.allPairs [ 21..24 ] [ false ; true ] |> Seq.ofList |> Seq.map box [] member _.Setup () = Run.shouldWrite <- false [] [] member this.Benchmark (args : obj) : unit = let day, isPartOne = unbox args if day <= 24 then Run.allRuns.[day - 1] (not isPartOne) (Inputs.day day) else if not isPartOne || day <> 25 then failwithf "Unexpected args: %+A" args else Run.day25 (Inputs.day 25) [] 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