Performance 结构的高效二进制编码

Performance 结构的高效二进制编码,performance,go,encoding,binary,Performance,Go,Encoding,Binary,我有一个发送udp数据包的程序。 数据包数据报由以下结构表示(请注意,数据包的大小不是固定的): 我使用编码/二进制包进行序列化/反序列化,但效率不够(使用pprof)。它浪费了大量的CPU时间,因此我无法利用整个网络的速度 例如,考虑下面的代码: packet := packet{ dataLength: 4, id: [8]byte{1,2,3,4,5,6,7,8}, pairity: 10, shards: 50, flags: 200, b

我有一个发送udp数据包的程序。 数据包数据报由以下结构表示(请注意,数据包的大小不是固定的):

我使用编码/二进制包进行序列化/反序列化,但效率不够(使用pprof)。它浪费了大量的CPU时间,因此我无法利用整个网络的速度

例如,考虑下面的代码:

packet := packet{
    dataLength: 4,
    id: [8]byte{1,2,3,4,5,6,7,8},
    pairity: 10,
    shards: 50,
    flags: 200,
    blob: []byte{1,2,3,4},
}
bufToSendOverNetwork := packet.ToBytes()

执行此操作(以及
.FromBytes
操作)最有效的方法是什么?

编码/二进制。Write
使用反射,因此它比任何手动构造缓冲区的方法都要慢。以下是此类功能的示例:

import (
    "encoding/binary"
)

func (p *packet) ToBytes() []byte {
    buff := make([]byte, 2 + 8 + 3 + len(p.blob))

    binary.BigEndian.PutUint16(buff[:2], p.dataLength)
    copy(buff[2:10], p.id[:])
    buff[10] = p.pairity
    buff[11] = p.shards
    buff[12] = p.flags
    copy(buff[13:], p.blob)

    return buff
}

您能否显示当前使用的二进制编码,以及瓶颈在哪里?由于
blob
是一个切片,因此您的Go结构不能直接写入以匹配数据包结构。
import (
    "encoding/binary"
)

func (p *packet) ToBytes() []byte {
    buff := make([]byte, 2 + 8 + 3 + len(p.blob))

    binary.BigEndian.PutUint16(buff[:2], p.dataLength)
    copy(buff[2:10], p.id[:])
    buff[10] = p.pairity
    buff[11] = p.shards
    buff[12] = p.flags
    copy(buff[13:], p.blob)

    return buff
}