This commit is contained in:
Patrick Stevens
2022-12-19 13:37:32 +00:00
committed by GitHub
parent a31ba974e5
commit f9d4b86e2d
13 changed files with 371 additions and 18 deletions

View File

@@ -28,6 +28,7 @@
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day16.txt" />
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day17.txt" />
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day18.txt" />
<EmbeddedResource Include="..\AdventOfCode2022.Test\Inputs\Day19.txt" />
</ItemGroup>
<ItemGroup>

View File

@@ -2,5 +2,5 @@ namespace AdventOfCode2022.App
[<RequireQualifiedAccess>]
module Inputs =
let days = Array.init 18 (fun day -> Assembly.readResource $"Day%i{day + 1}.txt")
let days = Array.init 19 (fun day -> Assembly.readResource $"Day%i{day + 1}.txt")
let inline day (i : int) = days.[i - 1]

View File

@@ -61,7 +61,7 @@ type Benchmark16To20 () =
[<GlobalSetup>]
member _.Setup () = Run.shouldWrite <- false
[<Params(16, 17, 18)>]
[<Params(16, 17, 18, 19)>]
member val Day = 0 with get, set
[<Params(false, true)>]

View File

@@ -260,6 +260,20 @@ module Run =
if shouldWrite then
printfn "%i" output
let day19 (partTwo : bool) (input : string) =
let day19 = StringSplitEnumerator.make '\n' input
if not partTwo then
let output = Day19.part1 day19
if shouldWrite then
printfn "%i" output
else
let output = Day19.part2 day19
if shouldWrite then
printfn "%i" output
let allRuns =
[|
day1
@@ -280,4 +294,5 @@ module Run =
day16
day17
day18
day19
|]

View File

@@ -26,6 +26,7 @@
<Compile Include="Day16.fs" />
<Compile Include="Day17.fs" />
<Compile Include="Day18.fs" />
<Compile Include="Day19.fs" />
<EmbeddedResource Include="Inputs\Day1.txt" />
<EmbeddedResource Include="Inputs\Day2.txt" />
<EmbeddedResource Include="Inputs\Day3.txt" />
@@ -44,6 +45,7 @@
<EmbeddedResource Include="Inputs\Day16.txt" />
<EmbeddedResource Include="Inputs\Day17.txt" />
<EmbeddedResource Include="Inputs\Day18.txt" />
<EmbeddedResource Include="Inputs\Day19.txt" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,34 @@
namespace AdventOfCode2022.Test
open NUnit.Framework
open FsUnitTyped
open AdventOfCode2022
[<TestFixture>]
module TestDay19 =
let input =
"""Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 2 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 2 ore and 7 obsidian.
Blueprint 2: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 8 clay. Each geode robot costs 3 ore and 12 obsidian.
"""
[<Test>]
let ``Part 1, given`` () =
Day19.part1 (StringSplitEnumerator.make '\n' input) |> shouldEqual 33
[<Test>]
let ``Part 1`` () =
let input = Assembly.readResource "Day19.txt"
Day19.part1 (StringSplitEnumerator.make '\n' input) |> shouldEqual 2341
[<Test>]
let ``Part 2, given`` () =
Day19.part2 (StringSplitEnumerator.make '\n' input) |> shouldEqual (62 * 56)
[<Test>]
let ``Part 2`` () =
let input = Assembly.readResource "Day19.txt"
Day19.part2 (StringSplitEnumerator.make '\n' input) |> shouldEqual 3689

View File

@@ -0,0 +1,30 @@
Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 8 clay. Each geode robot costs 2 ore and 18 obsidian.
Blueprint 2: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 4 ore and 15 obsidian.
Blueprint 3: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 17 clay. Each geode robot costs 3 ore and 8 obsidian.
Blueprint 4: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 19 clay. Each geode robot costs 2 ore and 12 obsidian.
Blueprint 5: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 4 ore and 7 obsidian.
Blueprint 6: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 7 clay. Each geode robot costs 2 ore and 19 obsidian.
Blueprint 7: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 4 ore and 11 obsidian.
Blueprint 8: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 7 clay. Each geode robot costs 3 ore and 10 obsidian.
Blueprint 9: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 6 clay. Each geode robot costs 2 ore and 16 obsidian.
Blueprint 10: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 5 clay. Each geode robot costs 3 ore and 15 obsidian.
Blueprint 11: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 10 clay. Each geode robot costs 2 ore and 13 obsidian.
Blueprint 12: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 12 clay. Each geode robot costs 3 ore and 17 obsidian.
Blueprint 13: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 19 clay. Each geode robot costs 2 ore and 18 obsidian.
Blueprint 14: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 6 clay. Each geode robot costs 4 ore and 11 obsidian.
Blueprint 15: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 12 clay. Each geode robot costs 3 ore and 8 obsidian.
Blueprint 16: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 16 clay. Each geode robot costs 4 ore and 16 obsidian.
Blueprint 17: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 7 clay. Each geode robot costs 3 ore and 8 obsidian.
Blueprint 18: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 2 ore and 16 obsidian.
Blueprint 19: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 2 ore and 8 obsidian.
Blueprint 20: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 11 clay. Each geode robot costs 3 ore and 14 obsidian.
Blueprint 21: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 2 ore and 13 obsidian.
Blueprint 22: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 9 clay. Each geode robot costs 3 ore and 7 obsidian.
Blueprint 23: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 4 ore and 8 obsidian.
Blueprint 24: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 5 clay. Each geode robot costs 3 ore and 12 obsidian.
Blueprint 25: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 3 ore and 16 obsidian.
Blueprint 26: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 17 clay. Each geode robot costs 3 ore and 10 obsidian.
Blueprint 27: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 9 clay. Each geode robot costs 3 ore and 7 obsidian.
Blueprint 28: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 11 clay. Each geode robot costs 3 ore and 8 obsidian.
Blueprint 29: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 16 clay. Each geode robot costs 2 ore and 11 obsidian.
Blueprint 30: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 17 clay. Each geode robot costs 2 ore and 13 obsidian.

View File

@@ -30,6 +30,7 @@
<Compile Include="Day16.fs" />
<Compile Include="Day17.fs" />
<Compile Include="Day18.fs" />
<Compile Include="Day19.fs" />
</ItemGroup>
<ItemGroup>

View File

@@ -3,12 +3,14 @@ namespace AdventOfCode2022
open System
open System.Collections.Generic
open System.Globalization
open System.Runtime.CompilerServices
#if DEBUG
open Checked
#endif
[<Struct>]
[<IsReadOnly>]
type Day13Packet =
| PacketList of leaf : Day13Packet[]
| Int of int : int

256
AdventOfCode2022/Day19.fs Normal file
View File

@@ -0,0 +1,256 @@
namespace AdventOfCode2022
open System
open FSharp.Collections.ParallelSeq
#if DEBUG
open Checked
#else
#nowarn "9"
#endif
type Day19Blueprint =
{
Index : int
Ore : int
Clay : int
ObsidianOre : int
ObsidianClay : int
GeodeOre : int
GeodeObsidian : int
}
[<RequireQualifiedAccess>]
module Day19 =
//Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 8 clay. Each geode robot costs 2 ore and 18 obsidian.
let parse (line : StringSplitEnumerator) : Day19Blueprint ResizeArray =
use mutable enum = line.GetEnumerator ()
let output = ResizeArray ()
while enum.MoveNext () do
if not (enum.Current.IsWhiteSpace ()) then
let mutable lineEnum = StringSplitEnumerator.make' ' ' (enum.Current.TrimEnd ())
StringSplitEnumerator.chomp "Blueprint" &lineEnum
if not (lineEnum.MoveNext ()) then
failwith "expected number"
let index = Int32.Parse (lineEnum.Current.TrimEnd ':')
StringSplitEnumerator.chomp "Each" &lineEnum
StringSplitEnumerator.chomp "ore" &lineEnum
StringSplitEnumerator.chomp "robot" &lineEnum
StringSplitEnumerator.chomp "costs" &lineEnum
let oreCost = StringSplitEnumerator.consumeInt &lineEnum
StringSplitEnumerator.chomp "ore." &lineEnum
StringSplitEnumerator.chomp "Each" &lineEnum
StringSplitEnumerator.chomp "clay" &lineEnum
StringSplitEnumerator.chomp "robot" &lineEnum
StringSplitEnumerator.chomp "costs" &lineEnum
let clayCost = StringSplitEnumerator.consumeInt &lineEnum
StringSplitEnumerator.chomp "ore." &lineEnum
StringSplitEnumerator.chomp "Each" &lineEnum
StringSplitEnumerator.chomp "obsidian" &lineEnum
StringSplitEnumerator.chomp "robot" &lineEnum
StringSplitEnumerator.chomp "costs" &lineEnum
let obsidianOreCost = StringSplitEnumerator.consumeInt &lineEnum
StringSplitEnumerator.chomp "ore" &lineEnum
StringSplitEnumerator.chomp "and" &lineEnum
let obsidianClayCost = StringSplitEnumerator.consumeInt &lineEnum
StringSplitEnumerator.chomp "clay." &lineEnum
StringSplitEnumerator.chomp "Each" &lineEnum
StringSplitEnumerator.chomp "geode" &lineEnum
StringSplitEnumerator.chomp "robot" &lineEnum
StringSplitEnumerator.chomp "costs" &lineEnum
let geodeOreCost = StringSplitEnumerator.consumeInt &lineEnum
StringSplitEnumerator.chomp "ore" &lineEnum
StringSplitEnumerator.chomp "and" &lineEnum
let geodeObsidianCost = StringSplitEnumerator.consumeInt &lineEnum
StringSplitEnumerator.chomp "obsidian." &lineEnum
{
Ore = oreCost
Clay = clayCost
ObsidianOre = obsidianOreCost
ObsidianClay = obsidianClayCost
GeodeOre = geodeOreCost
GeodeObsidian = geodeObsidianCost
Index = index
}
|> output.Add
output
/// If we started only creating new geode creators right now, how many geodes could we
/// mine by the end?
let inline bestPossible (timeRemaining : int) = timeRemaining * (timeRemaining - 1) / 2
let rec go
(blueprint : Day19Blueprint)
(bestSoFar : int)
(timeRemaining : int)
(oreCount : int)
(clayCount : int)
(obsidianCount : int)
(geodeCount : int)
(oreRobotCount : int)
(clayRobotCount : int)
(obsidianRobotCount : int)
=
if timeRemaining = 1 then
max bestSoFar geodeCount
else
// A weak overestimate at how many more geodes we'd get if we started building geode
// producers and nothing else, right now.
let bestPossible =
let neededBeforeGeodeBuild = blueprint.GeodeObsidian - obsidianCount
if neededBeforeGeodeBuild <= 0 then
timeRemaining
elif neededBeforeGeodeBuild <= obsidianRobotCount then
// Wait one timestep, then build
timeRemaining - 1
elif neededBeforeGeodeBuild <= 2 * obsidianRobotCount + 1 then
// Build an obsidian robot, then wait one timestep, then build geodes
timeRemaining - 2
else
timeRemaining - 3
|> bestPossible
if bestSoFar > geodeCount + bestPossible then
bestSoFar
else
let newOreCount = oreCount + oreRobotCount
let newClayCount = clayCount + clayRobotCount
let newObsidianCount = obsidianCount + obsidianRobotCount
let mutable best = bestSoFar
// If there are fewer than 10 turns remaining, it's always correct to create a geode
// builder if we can. Indeed, ore is not the limiting factor, so if we instead chose
// to make an obsidian builder, we'd lose 1 geode of opportunity cost, and then
// would have to wait at least 7 turns for the new obsidian builder to produce enough
// obsidian to make a replacement geode builder, then build the new geode builder on
// the 8th turn, then it produces a replacement geode on the 9th turn, breaking even.
if
timeRemaining < 10
&& oreCount >= blueprint.GeodeOre
&& obsidianCount >= blueprint.GeodeObsidian
then
go
blueprint
best
(timeRemaining - 1)
(newOreCount - blueprint.GeodeOre)
newClayCount
(newObsidianCount - blueprint.GeodeObsidian)
(geodeCount + timeRemaining - 1)
oreRobotCount
clayRobotCount
obsidianRobotCount
else
if oreCount >= blueprint.GeodeOre && obsidianCount >= blueprint.GeodeObsidian then
best <-
go
blueprint
best
(timeRemaining - 1)
(newOreCount - blueprint.GeodeOre)
newClayCount
(newObsidianCount - blueprint.GeodeObsidian)
(geodeCount + timeRemaining - 1)
oreRobotCount
clayRobotCount
obsidianRobotCount
// Can we build an obsidian robot?
// Note that if we have enough obsidian robots, then we're producing it as fast as we can consume it.
if
obsidianRobotCount < blueprint.GeodeObsidian
&& oreCount >= blueprint.ObsidianOre
&& clayCount >= blueprint.ObsidianClay
then
best <-
go
blueprint
best
(timeRemaining - 1)
(newOreCount - blueprint.ObsidianOre)
(newClayCount - blueprint.ObsidianClay)
newObsidianCount
geodeCount
oreRobotCount
clayRobotCount
(obsidianRobotCount + 1)
// Can we build an ore robot?
// Note that the biggest ore cost of anything is 4 ore, so if we have 4 ore-collecting robots then we
// are already producing ore as fast as we can consume it.
if oreRobotCount < 4 && oreCount >= blueprint.Ore then
best <-
go
blueprint
best
(timeRemaining - 1)
(newOreCount - blueprint.Ore)
newClayCount
newObsidianCount
geodeCount
(oreRobotCount + 1)
clayRobotCount
obsidianRobotCount
// Can we build a clay robot?
if clayRobotCount < blueprint.ObsidianClay && oreCount >= blueprint.Clay then
best <-
go
blueprint
best
(timeRemaining - 1)
(newOreCount - blueprint.Clay)
newClayCount
newObsidianCount
geodeCount
oreRobotCount
(clayRobotCount + 1)
obsidianRobotCount
go
blueprint
best
(timeRemaining - 1)
newOreCount
newClayCount
newObsidianCount
geodeCount
oreRobotCount
clayRobotCount
obsidianRobotCount
let doPart1 (blueprint : Day19Blueprint) : int =
let minOreCost = min blueprint.Ore blueprint.Clay
go blueprint 0 (24 - minOreCost) minOreCost 0 0 0 1 0 0
let part1 (line : StringSplitEnumerator) : int =
let blueprints = parse line
seq { 0 .. blueprints.Count - 1 }
|> PSeq.map (fun i -> blueprints.[i].Index * doPart1 blueprints.[i])
|> Seq.sum
let doPart2 (blueprint : Day19Blueprint) : int =
let minOreCost = min blueprint.Ore blueprint.Clay
go blueprint 0 (32 - minOreCost) minOreCost 0 0 0 1 0 0
let part2 (line : StringSplitEnumerator) : int =
let blueprints = parse line
let blueprints = Array.init (min blueprints.Count 3) (fun i -> blueprints.[i])
blueprints :> seq<_> |> PSeq.map doPart2 |> Seq.fold (*) 1

View File

@@ -8,9 +8,13 @@ Apple M1 Max, 1 CPU, 10 logical and 10 physical cores
```
| Method | Day | IsPartOne | Mean | Error | StdDev |
|---------- |---- |---------- |-------------:|-----------:|------------:|
| **Benchmark** | **16** | **False** | **4,825.261 ms** | **96.3610 ms** | **183.3368 ms** |
| **Benchmark** | **16** | **True** | **1,204.199 ms** | **11.6398 ms** | **10.8879 ms** |
| **Benchmark** | **17** | **False** | **4.928 ms** | **0.1057 ms** | **0.3049 ms** |
| **Benchmark** | **17** | **True** | **1.875 ms** | **0.0363 ms** | **0.0446 ms** |
| Method | Day | IsPartOne | Mean | Error | StdDev |
|---------- |---- |---------- |---------------:|-------------:|-------------:|
| **Benchmark** | **16** | **False** | **3,276,777.7 μs** | **47,105.18 μs** | **44,062.21 μs** |
| **Benchmark** | **16** | **True** | **328,457.3 μs** | **1,233.98 μs** | **1,154.27 μs** |
| **Benchmark** | **17** | **False** | **2,994.8 μs** | **9.41 μs** | **7.86 μs** |
| **Benchmark** | **17** | **True** | **1,562.7 μs** | **5.96 μs** | **5.57 μs** |
| **Benchmark** | **18** | **False** | **43,162.9 μs** | **92.81 μs** | **82.28 μs** |
| **Benchmark** | **18** | **True** | **137.7 μs** | **2.75 μs** | **2.95 μs** |
| **Benchmark** | **19** | **False** | **574,489.3 μs** | **2,008.49 μs** | **1,780.47 μs** |
| **Benchmark** | **19** | **True** | **701,588.1 μs** | **4,772.02 μs** | **4,230.27 μs** |

View File

@@ -1,5 +1,9 @@
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,16,False,"4,825.261 ms",96.3610 ms,183.3368 ms
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,16,True,"1,204.199 ms",11.6398 ms,10.8879 ms
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,17,False,4.928 ms,0.1057 ms,0.3049 ms
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,17,True,1.875 ms,0.0363 ms,0.0446 ms
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,16,False,"3,276,777.7 μs","47,105.18 μs","44,062.21 μ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,16,True,"328,457.3 μs","1,233.98 μs","1,154.27 μ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,17,False,"2,994.8 μs",9.41 μs,7.86 μ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,17,True,"1,562.7 μs",5.96 μs,5.57 μ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,18,False,"43,162.9 μs",92.81 μs,82.28 μ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,18,True,137.7 μs,2.75 μs,2.95 μ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,19,False,"574,489.3 μs","2,008.49 μs","1,780.47 μ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,19,True,"701,588.1 μs","4,772.02 μs","4,230.27 μs"
1 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
2 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 16 False 4,825.261 ms 3,276,777.7 μs 96.3610 ms 47,105.18 μs 183.3368 ms 44,062.21 μs
3 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 16 True 1,204.199 ms 328,457.3 μs 11.6398 ms 1,233.98 μs 10.8879 ms 1,154.27 μs
4 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 17 False 4.928 ms 2,994.8 μs 0.1057 ms 9.41 μs 0.3049 ms 7.86 μs
5 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 17 True 1.875 ms 1,562.7 μs 0.0363 ms 5.96 μs 0.0446 ms 5.57 μs
6 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 18 False 43,162.9 μs 92.81 μs 82.28 μs
7 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 18 True 137.7 μs 2.75 μs 2.95 μs
8 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 19 False 574,489.3 μs 2,008.49 μs 1,780.47 μs
9 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 19 True 701,588.1 μs 4,772.02 μs 4,230.27 μs

View File

@@ -2,7 +2,7 @@
<html lang='en'>
<head>
<meta charset='utf-8' />
<title>AdventOfCode2022.App.Benchmark16To20-20221217-164444</title>
<title>AdventOfCode2022.App.Benchmark16To20-20221219-132322</title>
<style type="text/css">
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -22,12 +22,16 @@ Apple M1 Max, 1 CPU, 10 logical and 10 physical cores
<pre><code></code></pre>
<table>
<thead><tr><th>Method</th><th>Day</th><th>IsPartOne</th><th> Mean</th><th>Error</th><th>StdDev</th>
<thead><tr><th>Method</th><th>Day</th><th>IsPartOne</th><th> Mean</th><th> Error</th><th>StdDev</th>
</tr>
</thead><tbody><tr><td>Benchmark</td><td>16</td><td>False</td><td>4,825.261 ms</td><td>96.3610 ms</td><td>183.3368 ms</td>
</tr><tr><td>Benchmark</td><td>16</td><td>True</td><td>1,204.199 ms</td><td>11.6398 ms</td><td>10.8879 ms</td>
</tr><tr><td>Benchmark</td><td>17</td><td>False</td><td>4.928 ms</td><td>0.1057 ms</td><td>0.3049 ms</td>
</tr><tr><td>Benchmark</td><td>17</td><td>True</td><td>1.875 ms</td><td>0.0363 ms</td><td>0.0446 ms</td>
</thead><tbody><tr><td>Benchmark</td><td>16</td><td>False</td><td>3,276,777.7 &mu;s</td><td>47,105.18 &mu;s</td><td>44,062.21 &mu;s</td>
</tr><tr><td>Benchmark</td><td>16</td><td>True</td><td>328,457.3 &mu;s</td><td>1,233.98 &mu;s</td><td>1,154.27 &mu;s</td>
</tr><tr><td>Benchmark</td><td>17</td><td>False</td><td>2,994.8 &mu;s</td><td>9.41 &mu;s</td><td>7.86 &mu;s</td>
</tr><tr><td>Benchmark</td><td>17</td><td>True</td><td>1,562.7 &mu;s</td><td>5.96 &mu;s</td><td>5.57 &mu;s</td>
</tr><tr><td>Benchmark</td><td>18</td><td>False</td><td>43,162.9 &mu;s</td><td>92.81 &mu;s</td><td>82.28 &mu;s</td>
</tr><tr><td>Benchmark</td><td>18</td><td>True</td><td>137.7 &mu;s</td><td>2.75 &mu;s</td><td>2.95 &mu;s</td>
</tr><tr><td>Benchmark</td><td>19</td><td>False</td><td>574,489.3 &mu;s</td><td>2,008.49 &mu;s</td><td>1,780.47 &mu;s</td>
</tr><tr><td>Benchmark</td><td>19</td><td>True</td><td>701,588.1 &mu;s</td><td>4,772.02 &mu;s</td><td>4,230.27 &mu;s</td>
</tr></tbody></table>
</body>
</html>