golang高效二进制编码

时间:2016-03-25 19:29:00

标签: performance go encoding binary

我有一个发送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 个答案:

答案 0 :(得分:3)

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
}