Write entire packet at once (#235)

Optimize `packWithoutCompression` function, close #234 .
This commit is contained in:
Richard Grover
2023-03-30 10:51:25 -06:00
committed by GitHub
parent 7d9ea21e65
commit 2e211573fb

View File

@ -55,28 +55,42 @@ func (p *Packet) Pack(w io.Writer, threshold int) error {
func (p *Packet) packWithoutCompression(w io.Writer) error { func (p *Packet) packWithoutCompression(w io.Writer) error {
buffer := bufPool.Get().(*bytes.Buffer) buffer := bufPool.Get().(*bytes.Buffer)
defer bufPool.Put(buffer) defer bufPool.Put(buffer)
// Pre-allocate room at the front of the packet for the length field
buffer.Reset() buffer.Reset()
n, err := VarInt(p.ID).WriteTo(buffer) buffer.Write([]byte{0, 0, 0})
if err != nil {
panic(err) VarInt(p.ID).WriteTo(buffer)
buffer.Write(p.Data)
payloadLen := uint32(buffer.Len() - 3)
// Determine where to start writing the header based on the payload size
var headerStart int
if payloadLen <= 0xFF>>1 {
headerStart = 2
} else if payloadLen <= 0xFFFF>>2 {
headerStart = 1
} else if payloadLen <= 0xFFFFFF>>3 {
headerStart = 0
} else {
panic(fmt.Errorf("packet length %d is too large", payloadLen))
} }
// Length
_, err = VarInt(int(n) + len(p.Data)).WriteTo(w) // Write the packet length at the beginning of the packet
if err != nil { for i := headerStart; payloadLen != 0; i++ {
b := byte(payloadLen & 0b01111111)
payloadLen >>= 7
if payloadLen != 0 {
b |= 0b10000000
}
buffer.Bytes()[i] = b
}
_, err := w.Write(buffer.Bytes()[headerStart:])
return err return err
} }
// Packet ID
_, err = buffer.WriteTo(w)
if err != nil {
return err
}
// Data
_, err = w.Write(p.Data)
if err != nil {
return err
}
return nil
}
func (p *Packet) packWithCompression(w io.Writer, threshold int) error { func (p *Packet) packWithCompression(w io.Writer, threshold int) error {
buff := bufPool.Get().(*bytes.Buffer) buff := bufPool.Get().(*bytes.Buffer)