3 回答
TA贡献1898条经验 获得超8个赞
以下是一些用于从字符串中去除所有空白字符的不同方法的基准测试:(源数据):
BenchmarkSpaceMap-8 2000 1100084 ns/op 221187 B/op 2 allocs/op
BenchmarkSpaceFieldsJoin-8 1000 2235073 ns/op 2299520 B/op 20 allocs/op
BenchmarkSpaceStringsBuilder-8 2000 932298 ns/op 122880 B/op 1 allocs/op
SpaceMap: 使用strings.Map; 随着遇到更多非空白字符,逐渐增加分配的空间量
SpaceFieldsJoin:strings.Fields和strings.Join; 产生大量中间数据
SpaceStringsBuilder用途strings.Builder; 执行单个分配,但如果源字符串主要是空格,则可能会严重过度分配。
package main_test
import (
"strings"
"unicode"
"testing"
)
func SpaceMap(str string) string {
return strings.Map(func(r rune) rune {
if unicode.IsSpace(r) {
return -1
}
return r
}, str)
}
func SpaceFieldsJoin(str string) string {
return strings.Join(strings.Fields(str), "")
}
func SpaceStringsBuilder(str string) string {
var b strings.Builder
b.Grow(len(str))
for _, ch := range str {
if !unicode.IsSpace(ch) {
b.WriteRune(ch)
}
}
return b.String()
}
func BenchmarkSpaceMap(b *testing.B) {
for n := 0; n < b.N; n++ {
SpaceMap(data)
}
}
func BenchmarkSpaceFieldsJoin(b *testing.B) {
for n := 0; n < b.N; n++ {
SpaceFieldsJoin(data)
}
}
func BenchmarkSpaceStringsBuilder(b *testing.B) {
for n := 0; n < b.N; n++ {
SpaceStringsBuilder(data)
}
}
TA贡献1836条经验 获得超3个赞
我发现最简单的方法是使用strings.ReplaceAll像这样:
randomString := " hello this is a test"
fmt.Println(strings.ReplaceAll(randomString, " ", ""))
>hellothisisatest
- 3 回答
- 0 关注
- 201 浏览
添加回答
举报