From da3a210bacea0114ad2a57a3c4c3e74938cb123c Mon Sep 17 00:00:00 2001 From: Patrick Stevens Date: Sun, 25 Dec 2022 11:50:46 +0000 Subject: [PATCH] Fix Day 25 benchmark (#42) --- AdventOfCode2022.App/Program.fs | 25 +++++++----- AdventOfCode2022/Day25.fs | 40 ++++++++++++++----- ...enchmarks.Benchmark21To25-report-github.md | 21 +++++----- ....App.Benchmarks.Benchmark21To25-report.csv | 19 ++++----- ...App.Benchmarks.Benchmark21To25-report.html | 21 +++++----- 5 files changed, 78 insertions(+), 48 deletions(-) diff --git a/AdventOfCode2022.App/Program.fs b/AdventOfCode2022.App/Program.fs index 3bbf889..d46ab71 100644 --- a/AdventOfCode2022.App/Program.fs +++ b/AdventOfCode2022.App/Program.fs @@ -75,22 +75,27 @@ module Benchmarks = [] member _.Cleanup () = Run.shouldWrite <- true - let finalBenchmarkArgs = (25, false) :: List.allPairs [ 21..24 ] [ false ; 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 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 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 diff --git a/AdventOfCode2022/Day25.fs b/AdventOfCode2022/Day25.fs index 829cbdc..a4df156 100644 --- a/AdventOfCode2022/Day25.fs +++ b/AdventOfCode2022/Day25.fs @@ -1,6 +1,7 @@ namespace AdventOfCode2022 open System +open System.Text open Microsoft.FSharp.NativeInterop #if DEBUG @@ -29,18 +30,39 @@ module Day25 = i - let rec ofInt (i : int64) : string = - if i <= 2L then - sprintf "%i" i - else + let ofInt (i : int64) : string = + let rec go (i : int64) (sb : ResizeArray) = + if i = 0 then + sb.Add '0' + elif i = 1 then + sb.Add '1' + elif i = 2 then + sb.Add '2' + else + match i % 5L with - | 0L -> sprintf "%s0" (ofInt (i / 5L)) - | 1L -> sprintf "%s1" (ofInt (i / 5L)) - | 2L -> sprintf "%s2" (ofInt (i / 5L)) - | 3L -> sprintf "%s=" (ofInt (i / 5L + 1L)) - | 4L -> sprintf "%s-" (ofInt (i / 5L + 1L)) + | 0L -> + sb.Add '0' + go (i / 5L) sb + | 1L -> + sb.Add '1' + go (i / 5L) sb + | 2L -> + sb.Add '2' + go (i / 5L) sb + | 3L -> + sb.Add '=' + go (i / 5L + 1L) sb + | 4L -> + sb.Add '-' + go (i / 5L + 1L) sb | _ -> failwith "maths doesn't work" + let sb = ResizeArray 27 + go i sb + sb.Reverse () + String (sb.ToArray ()) + /// Returns the width and the height too. The resulting array is suitable to become an Arr2D. let parse (line : StringSplitEnumerator) : int64 ResizeArray = use mutable enum = line.GetEnumerator () diff --git a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report-github.md b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report-github.md index 02cb583..928fdde 100644 --- a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report-github.md +++ b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report-github.md @@ -8,13 +8,14 @@ Apple M1 Max, 1 CPU, 10 logical and 10 physical cores ``` -| Method | Day | IsPartOne | Mean | Error | StdDev | -|---------- |---- |---------- |-------------:|------------:|------------:| -| **Benchmark** | **21** | **False** | **640.0 μs** | **4.20 μs** | **3.73 μs** | -| **Benchmark** | **21** | **True** | **579.2 μs** | **2.69 μs** | **2.38 μs** | -| **Benchmark** | **22** | **False** | **325.0 μs** | **1.48 μs** | **1.38 μs** | -| **Benchmark** | **22** | **True** | **218.2 μs** | **0.49 μs** | **0.43 μs** | -| **Benchmark** | **23** | **False** | **318,951.5 μs** | **4,809.31 μs** | **4,498.63 μs** | -| **Benchmark** | **23** | **True** | **2,715.4 μs** | **4.39 μs** | **3.43 μs** | -| **Benchmark** | **24** | **False** | **47,682.2 μs** | **44.89 μs** | **39.79 μs** | -| **Benchmark** | **24** | **True** | **15,713.4 μs** | **208.12 μs** | **173.79 μs** | +| Method | args | Mean | Error | StdDev | +|---------- |------------ |---------------:|--------------:|--------------:| +| **Benchmark** | **(21, False)** | **637.049 μs** | **1.0056 μs** | **0.8397 μs** | +| **Benchmark** | **(21, True)** | **575.965 μs** | **6.5023 μs** | **5.4297 μs** | +| **Benchmark** | **(22, False)** | **329.169 μs** | **1.9539 μs** | **1.8277 μs** | +| **Benchmark** | **(22, True)** | **216.176 μs** | **0.5694 μs** | **0.5327 μs** | +| **Benchmark** | **(23, False)** | **318,432.306 μs** | **5,235.8275 μs** | **4,897.5963 μs** | +| **Benchmark** | **(23, True)** | **2,694.296 μs** | **4.5002 μs** | **3.7579 μs** | +| **Benchmark** | **(24, False)** | **47,718.692 μs** | **106.8933 μs** | **89.2607 μs** | +| **Benchmark** | **(24, True)** | **15,540.162 μs** | **23.0957 μs** | **19.2860 μs** | +| **Benchmark** | **(25, True)** | **4.388 μs** | **0.0072 μs** | **0.0056 μs** | diff --git a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.csv b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.csv index ec4440c..688e4b8 100644 --- a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.csv +++ b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.csv @@ -1,9 +1,10 @@ -Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Day,IsPartOne,Mean,Error,StdDev -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,21,False,640.0 μs,4.20 μs,3.73 μs -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,21,True,579.2 μs,2.69 μs,2.38 μs -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,22,False,325.0 μs,1.48 μs,1.38 μs -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,22,True,218.2 μs,0.49 μs,0.43 μs -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,23,False,"318,951.5 μs","4,809.31 μs","4,498.63 μs" -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,23,True,"2,715.4 μs",4.39 μs,3.43 μs -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,24,False,"47,682.2 μs",44.89 μs,39.79 μs -Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,24,True,"15,713.4 μs",208.12 μs,173.79 μs +Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,args,Mean,Error,StdDev +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(21, False)",637.049 μs,1.0056 μs,0.8397 μs +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(21, True)",575.965 μs,6.5023 μs,5.4297 μs +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(22, False)",329.169 μs,1.9539 μs,1.8277 μs +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(22, True)",216.176 μs,0.5694 μs,0.5327 μs +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(23, False)","318,432.306 μs","5,235.8275 μs","4,897.5963 μs" +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(23, True)","2,694.296 μs",4.5002 μs,3.7579 μs +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(24, False)","47,718.692 μs",106.8933 μs,89.2607 μs +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(24, True)","15,540.162 μs",23.0957 μs,19.2860 μs +Benchmark,DefaultJob,False,Default,Default,Default,Default,Default,Default,0000000000,Empty,RyuJit,Arm64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 7.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"(25, True)",4.388 μs,0.0072 μs,0.0056 μs diff --git a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.html b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.html index d61d1b4..54184e7 100644 --- a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.html +++ b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmarks.Benchmark21To25-report.html @@ -2,7 +2,7 @@ -AdventOfCode2022.App.Benchmarks.Benchmark21To25-20221225-094139 +AdventOfCode2022.App.Benchmarks.Benchmark21To25-20221225-114355