fix performance by changing signature of tokenizeSubjectIntoSlice

Signed-off-by: Matthias Hanel <mh@synadia.com>
This commit is contained in:
Matthias Hanel
2021-07-22 16:46:57 -04:00
parent 06ac80cdbe
commit 0a33f040e9
2 changed files with 10 additions and 11 deletions

View File

@@ -2504,8 +2504,7 @@ func (c *client) addShadowSubscriptions(acc *Account, sub *subscription) error {
acc.mu.RLock()
subj := string(sub.subject)
if len(acc.imports.streams) > 0 {
tokens = tsa[:0]
tokenizeSubjectIntoSlice(subj, &tokens)
tokens = tokenizeSubjectIntoSlice(tsa[:0], subj)
for _, tk := range tokens {
if tk == pwcs {
hasWC = true
@@ -2530,12 +2529,10 @@ func (c *client) addShadowSubscriptions(acc *Account, sub *subscription) error {
}
if tokensModified {
// re-tokenize subj to overwrite modifications from a previous iteration
tokens = tsa[:0]
tokenizeSubjectIntoSlice(subj, &tokens)
tokens = tokenizeSubjectIntoSlice(tsa[:0], subj)
tokensModified = false
}
imTokens := imTsa[:0]
tokenizeSubjectIntoSlice(im.to, &imTokens)
imTokens := tokenizeSubjectIntoSlice(imTsa[:0], im.to)
if isSubsetMatchTokenized(tokens, imTokens) {
ims = append(ims, ime{im, _EMPTY_, true})

View File

@@ -1187,22 +1187,24 @@ func tokenAt(subject string, index uint8) string {
return _EMPTY_
}
func tokenizeSubjectIntoSlice(subject string, tts *[]string) {
// use similar to append. meaning, the updated slice will be returned
func tokenizeSubjectIntoSlice(tts []string, subject string) []string {
start := 0
for i := 0; i < len(subject); i++ {
if subject[i] == btsep {
*tts = append(*tts, subject[start:i])
tts = append(tts, subject[start:i])
start = i + 1
}
}
*tts = append(*tts, subject[start:])
tts = append(tts, subject[start:])
return tts
}
// Calls into the function isSubsetMatch()
func subjectIsSubsetMatch(subject, test string) bool {
tsa := [32]string{}
tts := tsa[:0]
tokenizeSubjectIntoSlice(subject, &tts)
tts = tokenizeSubjectIntoSlice(tts, subject)
return isSubsetMatch(tts, test)
}
@@ -1211,7 +1213,7 @@ func subjectIsSubsetMatch(subject, test string) bool {
func isSubsetMatch(tokens []string, test string) bool {
tsa := [32]string{}
tts := tsa[:0]
tokenizeSubjectIntoSlice(test, &tts)
tts = tokenizeSubjectIntoSlice(tts, test)
return isSubsetMatchTokenized(tokens, tts)
}