Browse Source

Avoid creating new objects so much

master
Chris Smith 4 years ago
parent
commit
7dbeca99b2
Signed by: Chris Smith <chris@chameth.com> GPG Key ID: 3A2D4BBDC4A3C9A9
2 changed files with 39 additions and 23 deletions
  1. 14
    23
      14/main.go
  2. 25
    0
      14/main_test.go

+ 14
- 23
14/main.go View File

44
 	return recipes
44
 	return recipes
45
 }
45
 }
46
 
46
 
47
-func (rb recipeBook) produce(target *amount, used map[chemical]int, spare map[chemical]int) {
48
-	recipe := rb[target.chemical]
49
-	needed := target.quantity
47
+func (rb recipeBook) produce(target chemical, quantity int, used map[chemical]int, spare map[chemical]int) {
48
+	recipe := rb[target]
49
+	needed := quantity
50
 
50
 
51
 	if recipe == nil {
51
 	if recipe == nil {
52
-		used[target.chemical] += needed
52
+		used[target] += needed
53
 		return
53
 		return
54
 	}
54
 	}
55
 
55
 
56
-	free := spare[target.chemical]
56
+	free := spare[target]
57
 	if free >= needed {
57
 	if free >= needed {
58
-		used[target.chemical] += needed
59
-		spare[target.chemical] -= needed
58
+		used[target] += needed
59
+		spare[target] -= needed
60
 		return
60
 		return
61
 	} else {
61
 	} else {
62
-		used[target.chemical] += free
63
-		spare[target.chemical] = 0
62
+		used[target] += free
63
+		spare[target] = 0
64
 		needed -= free
64
 		needed -= free
65
 	}
65
 	}
66
 
66
 
67
 	runs := int(math.Ceil(float64(needed) / float64(recipe.produces.quantity)))
67
 	runs := int(math.Ceil(float64(needed) / float64(recipe.produces.quantity)))
68
 	for _, i := range recipe.requires {
68
 	for _, i := range recipe.requires {
69
-		rb.produce(&amount{
70
-			chemical: i.chemical,
71
-			quantity: i.quantity * runs,
72
-		}, used, spare)
69
+		rb.produce(i.chemical, i.quantity*runs, used, spare)
73
 	}
70
 	}
74
 
71
 
75
-	used[target.chemical] += needed
76
-	spare[target.chemical] += (recipe.produces.quantity * runs) - needed
72
+	used[target] += needed
73
+	spare[target] += (recipe.produces.quantity * runs) - needed
77
 }
74
 }
78
 
75
 
79
 func main() {
76
 func main() {
81
 	used := make(map[chemical]int, len(recipes))
78
 	used := make(map[chemical]int, len(recipes))
82
 	spare := make(map[chemical]int, len(recipes))
79
 	spare := make(map[chemical]int, len(recipes))
83
 
80
 
84
-	recipes.produce(&amount{
85
-		chemical: "FUEL",
86
-		quantity: 1,
87
-	}, used, spare)
81
+	recipes.produce("FUEL", 1, used, spare)
88
 
82
 
89
 	orePerFuel := used["ORE"]
83
 	orePerFuel := used["ORE"]
90
 	println(used["ORE"])
84
 	println(used["ORE"])
92
 	last := 0
86
 	last := 0
93
 	for used["ORE"] < 1000000000000 {
87
 	for used["ORE"] < 1000000000000 {
94
 		last = used["FUEL"]
88
 		last = used["FUEL"]
95
-		recipes.produce(&amount{
96
-			chemical: "FUEL",
97
-			quantity: common.Max(1, (1000000000000-used["ORE"])/orePerFuel),
98
-		}, used, spare)
89
+		recipes.produce("FUEL", common.Max(1, (1000000000000-used["ORE"])/orePerFuel), used, spare)
99
 	}
90
 	}
100
 
91
 
101
 	println(last)
92
 	println(last)

+ 25
- 0
14/main_test.go View File

1
+package main
2
+
3
+import (
4
+	"github.com/csmith/aoc-2019/common"
5
+	"testing"
6
+)
7
+
8
+func Benchmark(b *testing.B) {
9
+	for i := 0; i < b.N; i++ {
10
+		recipes := parseInput("input.txt")
11
+		used := make(map[chemical]int, len(recipes))
12
+		spare := make(map[chemical]int, len(recipes))
13
+
14
+		recipes.produce("FUEL", 1, used, spare)
15
+		orePerFuel := used["ORE"]
16
+
17
+		last := 0
18
+		for used["ORE"] < 1000000000000 {
19
+			last = used["FUEL"]
20
+			recipes.produce("FUEL", common.Max(1, (1000000000000-used["ORE"])/orePerFuel), used, spare)
21
+		}
22
+
23
+		_ = last
24
+	}
25
+}

Loading…
Cancel
Save