Names sorted by nameKey, upper-casing both names in every comparison. The formula bar looks up the selection's name on every frame, so 1000 names cost 20,000 allocations a frame. The map keys are already upper case. View/names-1000/80x24 662 us, 21k allocs -> 193 us, 700 allocs View/names-1000/400x120 1.48 ms -> 1.00 ms
- commit
- 1ec8e70633160b80dbe5066fc1b8356104fe92f5
- parent
- e1daf4c58fb2e7ed65e21bad36c0053d21be80d0
- author
- Dami <dami.etoile@gmail.com>
| M | internal/ | 11 | ++++++++--- |
@@ -1,7 +1,6 @@
11 package sheet22 33 import (4- "cmp"54 "errors"65 "fmt"76 "maps"@@ -85,8 +84,14 @@ func looksLikeRef(k string) bool {
8584 8685 // Names returns the named ranges, sorted by name.8786 func (s *Sheet) Names() []Name {88- out := slices.Collect(maps.Values(s.names))89- slices.SortFunc(out, func(a, b Name) int { return cmp.Compare(nameKey(a.Name), nameKey(b.Name)) })87+ // The keys are already upper case: sorting names by nameKey upper-cased88+ // both sides of every comparison, 20,000 allocations a frame for 100089+ // names, since the formula bar looks for the selection's name.90+ keys := slices.Sorted(maps.Keys(s.names))91+ out := make([]Name, len(keys))92+ for i, k := range keys {93+ out[i] = s.names[k]94+ }9095 return out9196 }9297