为了账号安全,请及时绑定邮箱和手机立即绑定

结构体的高效二进制编码

结构体的高效二进制编码

Go
慕桂英3389331 2021-12-27 17:03:03
我有一个发送 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操作)的最有效方法是什么
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

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

}


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信