我尝试/尝试了三种反转字符串的方法,使用 Runes 和就地交换。建议像这里这样的多个地方
func ReverseWithRune(str string) string {
runes := []rune(str)
for i, j := len(runes)-1, 0; j < i; i, j = i-1, j+1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
使用 strings.Builder
func ReverseWithBuilder(str string) string {
var ret strings.Builder
strLen := len(str)
ret.Grow(strLen)
for i := strLen - 1; i >= 0; i-- {
ret.WriteByte(str[i])
}
return ret.String()
}
使用从输入字符串末尾填充的字节数组
func ReverseWithByteArray(str string) string {
strLen := len(str)
ret := make([]byte, strLen)
for i := strLen - 1; i >= 0; i-- {
ret[strLen-i-1] = str[i]
}
return string(ret)
}
我想ReverseWithRune,ReverseWithBuilder应该比.快ReverseWithByteArray。ReverseWithByteArray无复制、更少的分配等。但对于小的 9 或大的 99999 长度字符串,字节数组的基准测试总是更快。
RuneArr_9-4 9545110 111.3 ns/op 16 B/op 1 allocs/op
StringBuil_9-4 24685213 40.79 ns/op 16 B/op 1 allocs/op
ByteArr_9-4 23045233 52.35 ns/op 32 B/op 2 allocs/op
Rune_99999-4 1110 1002334 ns/op 507904 B/op 2 allocs/op
StringBuil_99999-4 6679 179333 ns/op 106496 B/op 1 allocs/op
ByteArr_99999-4 12200 97876 ns/op 212992 B/op 2 allocs/op
我的问题是
为什么 rune 和 builder 方法没有更快,尽管迭代次数较少(lenght/2)和到位等。
另一个明显的问题是,符文/生成器方法可以改进吗?可能是我在这里用错了。
细节
goos: linux goarch: amd64
cpu: Intel(R) Core(TM) i5-7200U CPU @2.50GHz
go version: go1.19.2 linux/amd64
我试图查看配置文件,它显示了slicerunetostring
主要strings.Builder.WriteBytes
的繁重操作。
字节反向也很大,但也是因为它有更多的操作。
大话西游666
相关分类