Skip to content

Commit d408877

Browse files
committed
Speed up levenshteinWithMax by reusing buffers
1 parent 94ae2f2 commit d408877

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

internal/core/core.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"slices"
88
"sort"
99
"strings"
10+
"sync"
1011
"unicode"
1112
"unicode/utf8"
1213

@@ -502,9 +503,28 @@ func GetSpellingSuggestion[T any](name string, candidates []T, getName func(T) s
502503
return bestCandidate
503504
}
504505

506+
type levenshteinBuffers struct {
507+
previous []float64
508+
current []float64
509+
}
510+
511+
var levenshteinBuffersPool = sync.Pool{
512+
New: func() any {
513+
return &levenshteinBuffers{}
514+
},
515+
}
516+
505517
func levenshteinWithMax(s1 []rune, s2 []rune, maxValue float64) float64 {
506-
previous := make([]float64, len(s2)+1)
507-
current := make([]float64, len(s2)+1)
518+
buffers := levenshteinBuffersPool.Get().(*levenshteinBuffers)
519+
defer levenshteinBuffersPool.Put(buffers)
520+
521+
bufferSize := len(s2) + 1
522+
buffers.previous = slices.Grow(buffers.previous[:0], bufferSize)[:bufferSize]
523+
buffers.current = slices.Grow(buffers.current[:0], bufferSize)[:bufferSize]
524+
525+
previous := buffers.previous
526+
current := buffers.current
527+
508528
big := maxValue + 0.01
509529
for i := range previous {
510530
previous[i] = float64(i)

0 commit comments

Comments
 (0)