долго работает нормализация, по факту это просто при большом размере strings.ToLower() либо у них есть функция для небольших строк, которая использует свой ToLower (copyLower) - в этом подходе она запихивает всё в буффер там уменьшает занчения.
Но и в одном и в другом подходе происходит alloc:
strings.ToLower() - вообще работает с map,
а их личная функция возаращает буффер, а string(buf) - это тоже alloc (у нас задача вернуть string)
strings.Replace - работает без alloc, но это достаточно долгое решение
может кто находил замену toLower без alloc? Или кто-то знает вариант как преобразовать buffer в строку без alloc т.е без string(buf)
func normalise(ua string) string {
if len(ua) <= 1024 {
var buf [1024]byte
ascii := copyLower(buf[:len(ua)], ua)
if !ascii {
// Fall back for non ascii characters
return strings.ToLower(ua)
}
return string(buf[:len(ua)])
}
// Fallback for unusually long strings
return strings.ToLower(ua)
}
func copyLower(b []byte, s string) bool {
for j := 0; j < len(s); j++ {
c := s[j]
if c > 127 {
return false
} else {
if 'A' <= c && c <= 'Z' {
c += 'a' - 'A'
}
}
b[j] = c
}
return true
}
Попробуй использовать https://golang.org/pkg/unicode/utf8/#DecodeRune И вместо буфера клади сразу в ту же строку из которой читаешь.
Спасибо, попробую!
Обсуждают сегодня