Modified permuteExistingNumbers() to pre-allocate sufficiently large slice for all...
[surreal-numbers] / chapter-1-experiments / ch1-breeding-numbers.go
index 58576cc..fc1c397 100644 (file)
@@ -300,7 +300,11 @@ func main() {
 // right sets. This covers all the reduced form permutations. Any longer
 // permutations will be similar to one of the reduced forms.
 func permuteExistingNumbers(generation int, universe surrealUniverse) []surrealNumber {
 // right sets. This covers all the reduced form permutations. Any longer
 // permutations will be similar to one of the reduced forms.
 func permuteExistingNumbers(generation int, universe surrealUniverse) []surrealNumber {
-    var numbers []surrealNumber
+    // Profiling indicates that most calls to growSlice() and memMove()
+    // originate in this function. Allocating a sufficiently large slice
+    // upfront results in 2x speed improvement and 1/3 reduction in heap usage.
+    numberOfPermutations := ((universe.cardinality()+1) * (universe.cardinality()+1)) - 1
+    numbers := make([]surrealNumber, 0, numberOfPermutations)
 
     // First build permutations with 1 element in each set.
     for i := 0; i < universe.cardinality(); i++ {
 
     // First build permutations with 1 element in each set.
     for i := 0; i < universe.cardinality(); i++ {