From 34dab08fbfb80035274242ee032b277791c7a62a Mon Sep 17 00:00:00 2001 From: Patrick Stevens Date: Fri, 23 Dec 2022 14:13:26 +0000 Subject: [PATCH] Day 23 speedup (#38) --- AdventOfCode2022/Day23.fs | 17 +++++++++++++---- ...ode2022.App.Benchmark21To25-report-github.md | 12 ++++++------ ...entOfCode2022.App.Benchmark21To25-report.csv | 12 ++++++------ ...ntOfCode2022.App.Benchmark21To25-report.html | 14 +++++++------- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/AdventOfCode2022/Day23.fs b/AdventOfCode2022/Day23.fs index 6c876cd..c580b3b 100644 --- a/AdventOfCode2022/Day23.fs +++ b/AdventOfCode2022/Day23.fs @@ -48,11 +48,12 @@ module Day23 = proposedEndSteps.Clear () for elf in board do - let mutable hasAdjacentElf = false + let mutable adjacentElfOffsetX = Int32.MinValue + let mutable adjacentElfOffsetY = Int32.MinValue for xOffset = -1 to 1 do for yOffset = -1 to 1 do - if not hasAdjacentElf && (xOffset <> 0 || yOffset <> 0) then + if adjacentElfOffsetX = Int32.MinValue && (xOffset <> 0 || yOffset <> 0) then let adjacentElf = { X = elf.X + xOffset @@ -60,12 +61,20 @@ module Day23 = } if board.Contains adjacentElf then - hasAdjacentElf <- true + adjacentElfOffsetX <- xOffset - if hasAdjacentElf then + adjacentElfOffsetY <- yOffset + + if adjacentElfOffsetX <> Int32.MinValue then let mutable proposedEndPlace = ValueNone for struct (proposedX, proposedY) in proposedDirections do + if proposedX = 0 && proposedY = adjacentElfOffsetY then + () + elif proposedY = 0 && proposedX = adjacentElfOffsetX then + () + else + let mutable hasElfInDestination = false if proposedEndPlace.IsNone then diff --git a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report-github.md b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report-github.md index 6dd1331..7089f45 100644 --- a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report-github.md +++ b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report-github.md @@ -10,9 +10,9 @@ Apple M1 Max, 1 CPU, 10 logical and 10 physical cores ``` | Method | Day | IsPartOne | Mean | Error | StdDev | |---------- |---- |---------- |-------------:|----------:|----------:| -| **Benchmark** | **21** | **False** | **649.0 μs** | **4.46 μs** | **3.96 μs** | -| **Benchmark** | **21** | **True** | **584.9 μs** | **4.29 μs** | **3.80 μs** | -| **Benchmark** | **22** | **False** | **331.7 μs** | **2.26 μs** | **2.12 μs** | -| **Benchmark** | **22** | **True** | **220.6 μs** | **0.70 μs** | **0.62 μs** | -| **Benchmark** | **23** | **False** | **346,889.4 μs** | **900.55 μs** | **798.31 μs** | -| **Benchmark** | **23** | **True** | **3,128.1 μs** | **4.91 μs** | **4.35 μs** | +| **Benchmark** | **21** | **False** | **720.1 μs** | **11.79 μs** | **11.03 μs** | +| **Benchmark** | **21** | **True** | **588.8 μs** | **3.52 μs** | **3.12 μs** | +| **Benchmark** | **22** | **False** | **336.7 μs** | **2.82 μs** | **2.50 μs** | +| **Benchmark** | **22** | **True** | **220.5 μs** | **1.51 μs** | **1.41 μs** | +| **Benchmark** | **23** | **False** | **333,927.6 μs** | **577.75 μs** | **512.16 μs** | +| **Benchmark** | **23** | **True** | **2,782.4 μs** | **7.04 μs** | **6.58 μs** | diff --git a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.csv b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.csv index 36a2afb..5229cd7 100644 --- a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.csv +++ b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.csv @@ -1,7 +1,7 @@ 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,649.0 μs,4.46 μs,3.96 μ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,584.9 μs,4.29 μs,3.80 μ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,331.7 μs,2.26 μs,2.12 μ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,220.6 μs,0.70 μs,0.62 μ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,"346,889.4 μs",900.55 μs,798.31 μ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,"3,128.1 μs",4.91 μs,4.35 μ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,False,720.1 μs,11.79 μs,11.03 μ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,588.8 μs,3.52 μs,3.12 μ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,336.7 μs,2.82 μs,2.50 μ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,220.5 μs,1.51 μs,1.41 μ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,"333,927.6 μs",577.75 μs,512.16 μ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,782.4 μs",7.04 μs,6.58 μs diff --git a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.html b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.html index ebab15e..5cc95da 100644 --- a/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.html +++ b/BenchmarkDotNet.Artifacts/results/AdventOfCode2022.App.Benchmark21To25-report.html @@ -2,7 +2,7 @@ -AdventOfCode2022.App.Benchmark21To25-20221223-135302 +AdventOfCode2022.App.Benchmark21To25-20221223-140756