performance - 有没有更有效的函数来查找[]字节相似度?

标签 performance go byte

我正在寻找一种有效的方法来查找两个 byte slice 之间的前缀相似性。我目前正在使用此功能,但如果可能的话,正在寻找一种更有效的方法。

谢谢你。

s1 -> [0 15 136 96 88 76 0 0 0 1] 
s2 -> [0 15 136 96 246 1 255 255 255 255]

output -> [0 15 136 96] 

func bytesSimilar(s1 []byte, s2 []byte) []byte {
    for !bytes.Equal(s1,s2) {
        s1 = s1[:len(s1)-1]
        s2 = s2[:len(s2)-1]
    }
    return s1
}

基准测试代码:
func BenchmarkBytePrefix200(b *testing.B) {
    s1 := []byte{0, 15, 136, 96, 88, 76, 0, 0, 0, 1}
    s2 := []byte{0, 15, 136, 96, 246, 1, 255, 255, 255, 255}
    b.ReportAllocs()
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        bytePrefix(s1, s2)
    }
}

MBP上的结果:
BenchmarkBytePrefix200-8    48738078            29.5 ns/op         0 B/op          0 allocs/op

最佳答案

如果bytePrefix与您的问题中的bytesSimilar相同:

func BytesSimilarNew(s1 []byte, s2 []byte) []byte {
    for i := 0; i < len(s1); i++ {
        if s1[i] ^ s2[i] > 0 {
            return s1[:i]
        }
    }
    return []byte{}
}

然后进行比较:
BenchmarkBytePrefix200
BenchmarkBytePrefix200-8        28900861            36.5 ns/op         0 B/op          0 allocs/op
BenchmarkByteSimilarNew200
BenchmarkByteSimilarNew200-8    237646268            5.06 ns/op        0 B/op          0 allocs/op
PASS

关于performance - 有没有更有效的函数来查找[]字节相似度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61475070/

相关文章:

c# - 将字节更改为字符串的简单方法?

java 到 objective c 和 malloc

c - 如何将 float 转换为无符号变量?

performance - Kubernetes NFS 挂载选项

c++ - 在 C++ 的头文件中编写函数定义

go - Amazon Cognito 的 JWK 不包含 X5c 字段

在 repo 中使用多个模块时,Go get 找不到本地包

linux - 无法输出缓冲区

php - 选择哪种解决方案以获得更好的性能?为什么?

mysql - Django - 使用注释提高查询集的性能