gpt4 book ai didi

performance - 将几个 []byte 连接在一起的最快方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:21:46 25 4
gpt4 key购买 nike

现在我正在使用下面的代码(如 BenchmarkEncoder()),它很快,但我想知道是否有更快、更有效的方法。我使用 GOMAXPROCS=1 进行基准测试,并且:

sudo -E nice -n -20 go test -bench . -benchmem -benchtime 3s

.

package blackbird

import (
"testing"
"encoding/hex"
"log"
"bytes"
"encoding/json"
)

var (
d1, d2, d3, d4, outBytes []byte
toEncode [][]byte
)

func init() {
var err interface{}
d1, err = hex.DecodeString("6e5438fd9c3748868147d7a4f6d355dd")
d2, err = hex.DecodeString("0740e2dfa4b049f2beeb29cc304bdb5f")
d3, err = hex.DecodeString("ab6743272358467caff7d94c3cc58e8c")
d4, err = hex.DecodeString("7411c080762a47f49e5183af12d87330e6d0df7dd63a44808db4e250cdea0a36182fce4a309842e49f4202eb90184dd5b621d67db4a04940a29e981a5aea59be")
if err != nil {
log.Fatal("hex decoding failed: %v", err)
}
toEncode = [][]byte{d1, d2, d3, d4}

}

func Encode(stuff [][]byte) []byte {
return bytes.Join(stuff, nil)
}

func BenchmarkEncoderDirect(b *testing.B) {
for i := 0; i < b.N; i++ {
bytes.Join(toEncode, nil)
}
}

func BenchmarkEncoder(b *testing.B) {
for i := 0; i < b.N; i++ {
Encode(toEncode)
}
}

func BenchmarkJsonEncoder(b *testing.B) {
for i := 0; i < b.N; i++ {
outBytes, _ = json.Marshal(toEncode)

}
}

将多个 []byte 连接在一起的最快方法是什么?

最佳答案

bytes.Join()非常快,但是它做了一些额外的工作,在可追加的 byte slice 之间追加分隔符。即使分隔符是空的或 nil slice ,它也会这样做。

因此,如果您关心最佳性能(尽管它会略有改进),您可以执行 bytes.Join() 所做的而不附加(空)分隔符:分配一个足够大的字节 slice ,并使用内置的 copy() 将每个 slice 复制到结果中功能。

Go Playground 上试试:

func Join(s ...[]byte) []byte {
n := 0
for _, v := range s {
n += len(v)
}

b, i := make([]byte, n), 0
for _, v := range s {
i += copy(b[i:], v)
}
return b
}

使用它:

concatenated := Join(d1, d2, d3, d4)

改进:

如果您事先知道总大小(或者您可以比遍历 slice 更快地计算它),请提供它,这样您就可以避免必须遍历 slice 才能计算所需的大小:

func JoinSize(size int, s ...[]byte) []byte {
b, i := make([]byte, size), 0
for _, v := range s {
i += copy(b[i:], v)
}
return b
}

在你的案例中使用它:

concatenated := JoinSize(48 + len(d4), d1, d2, d3, d4)

注意事项:

但是如果你最终的目标是将连接的字节 slice 写入 io.Writer , 性能方面,最好不要将它们连接起来,而是将它们分别写入。

关于performance - 将几个 []byte 连接在一起的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32370615/

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