gpt4 book ai didi

string - 将字符串转换为二进制字符串表示的有效方法

转载 作者:IT王子 更新时间:2023-10-29 01:57:34 24 4
gpt4 key购买 nike

我正在寻找如何以最佳性能将字符串转换为二进制字符串表示形式。

所以我从类似于以下内容开始:

func binConvertOrig(s string) string {
var buf bytes.Buffer
for i := 0; i < len(s); i++ {
fmt.Fprintf(&buf, "%08b", s[i])
}
return buf.String()
}

s := "Test"
log.Printf("%s => binConvertOrig => %s", s, binConvertOrig(s))

不过好像fmt.Fprintf & bytes.Buffer效率不是很高。

有更好的方法吗?

谢谢

最佳答案

没有什么比预先计算的查找表更好的了,特别是如果它存储在 slice 或数组中(而不是在映射中),并且转换器为结果分配大小合适的字节 slice :

var byteBinaries [256][]byte

func init() {
for i := range byteBinaries {
byteBinaries[i] = []byte(fmt.Sprintf("%08b", i))
}
}

func strToBin(s string) string {
res := make([]byte, len(s)*8)
for i := len(s) - 1; i >= 0; i-- {
copy(res[i*8:], byteBinaries[s[i]])
}
return string(res)
}

测试它:

fmt.Println(strToBin("\x01\xff"))

输出(在 Go Playground 上尝试):

0000000111111111

基准

让我们看看它能达到多快:

var texts = []string{
"\x00",
"123",
"1234567890",
"asdf;lkjasdf;lkjasdf;lkj108fhq098wf34",
}

func BenchmarkOrig(b *testing.B) {
for n := 0; n < b.N; n++ {
for _, t := range texts {
binConvertOrig(t)
}
}
}

func BenchmarkLookup(b *testing.B) {
for n := 0; n < b.N; n++ {
for _, t := range texts {
strToBin(t)
}
}
}

结果:

BenchmarkOrig-4      200000     8526 ns/op       2040 B/op     12 allocs/op
BenchmarkLookup-4 2000000 781 ns/op 880 B/op 8 allocs/op

查找版本 (strToBin()) 快 11 倍 并且使用更少的内存和分配。基本上它只对结果使用分配(这是不可避免的)。

关于string - 将字符串转换为二进制字符串表示的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46848867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com