// 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++ {