结构体的高效二进制编码

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


type packet struct {

    dataLength uint16

    id [8]byte

    pairity, shards, flags byte

    blob []byte // length defined by dataLength 

}

我使用编码/二进制包进行序列化/反序列化,但效率不够(使用 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操作)的最有效方法是什么


慕桂英3389331
浏览 150回答 1
1回答

HUH函数

encoding/binary.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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go