mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-20 21:31:32 +02:00
Add benchmark for transliteration
This commit is contained in:
@@ -23,6 +23,64 @@ import (
|
|||||||
"golang.org/x/text/unicode/norm"
|
"golang.org/x/text/unicode/norm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var transliteratePool = &sync.Pool{
|
||||||
|
New: func() any {
|
||||||
|
return transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)),
|
||||||
|
runes.Map(func(r rune) rune {
|
||||||
|
switch r {
|
||||||
|
case 'ą':
|
||||||
|
return 'a'
|
||||||
|
case 'ć':
|
||||||
|
return 'c'
|
||||||
|
case 'ę':
|
||||||
|
return 'e'
|
||||||
|
case 'ł':
|
||||||
|
return 'l'
|
||||||
|
case 'ń':
|
||||||
|
return 'n'
|
||||||
|
case 'ó':
|
||||||
|
return 'o'
|
||||||
|
case 'ś':
|
||||||
|
return 's'
|
||||||
|
case 'ż':
|
||||||
|
return 'z'
|
||||||
|
case 'ź':
|
||||||
|
return 'z'
|
||||||
|
case 'ø':
|
||||||
|
return 'o'
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}),
|
||||||
|
norm.NFC)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var transliterateMap = map[rune]rune{
|
||||||
|
'ą': 'a',
|
||||||
|
'ć': 'c',
|
||||||
|
'ę': 'e',
|
||||||
|
'ł': 'l',
|
||||||
|
'ń': 'n',
|
||||||
|
'ó': 'o',
|
||||||
|
'ś': 's',
|
||||||
|
'ż': 'z',
|
||||||
|
'ź': 'z',
|
||||||
|
'ø': 'o',
|
||||||
|
}
|
||||||
|
|
||||||
|
var transliteratePoolMap = &sync.Pool{
|
||||||
|
New: func() any {
|
||||||
|
return transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)),
|
||||||
|
runes.Map(func(r rune) rune {
|
||||||
|
if rr, ok := transliterateMap[r]; ok {
|
||||||
|
return rr
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}),
|
||||||
|
norm.NFC)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
var accentTransformerPool = &sync.Pool{
|
var accentTransformerPool = &sync.Pool{
|
||||||
New: func() any {
|
New: func() any {
|
||||||
return transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
|
return transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
|
||||||
@@ -47,6 +105,22 @@ func RemoveAccentsString(s string) string {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TransliterateString(s string) string {
|
||||||
|
t := transliteratePool.Get().(transform.Transformer)
|
||||||
|
s, _, _ = transform.String(t, s)
|
||||||
|
t.Reset()
|
||||||
|
transliteratePool.Put(t)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func TransliterateStringMap(s string) string {
|
||||||
|
t := transliteratePoolMap.Get().(transform.Transformer)
|
||||||
|
s, _, _ = transform.String(t, s)
|
||||||
|
t.Reset()
|
||||||
|
transliteratePoolMap.Put(t)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// Chomp removes trailing newline characters from s.
|
// Chomp removes trailing newline characters from s.
|
||||||
func Chomp(s string) string {
|
func Chomp(s string) string {
|
||||||
return strings.TrimRightFunc(s, func(r rune) bool {
|
return strings.TrimRightFunc(s, func(r rune) bool {
|
||||||
|
@@ -70,3 +70,19 @@ func BenchmarkVisitLinesAfter(b *testing.B) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkTransliterate(b *testing.B) {
|
||||||
|
s := "ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ"
|
||||||
|
|
||||||
|
b.Run("switch", func(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
_ = TransliterateString(s)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
b.Run("map", func(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
_ = TransliterateStringMap(s)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user