Skip to content

Commit c6e3c96

Browse files
author
jeffall
committed
Reduce write system calls, thus fewer TCP packets
Do a bit more copying around in user space before handing off the data to the kernel, so that Before this change, one connect, publish and disconnect was 19 packets. After this change, it is 14 packets. Ethernet/IP/TCP overhead is about 66 bytes. So with this change, we use 73% of the bandwidth as before (14*66/19*66 = 0.73).
1 parent 133aa78 commit c6e3c96

1 file changed

Lines changed: 15 additions & 5 deletions

File tree

messages.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,30 @@ type Header struct {
1818
}
1919

2020
func (hdr *Header) Encode(w io.Writer, msgType MessageType, remainingLength int32) error {
21+
buf := new(bytes.Buffer)
22+
err := hdr.encodeInto(buf, msgType, remainingLength)
23+
if err != nil {
24+
return err
25+
}
26+
_, err = w.Write(buf.Bytes())
27+
return err
28+
}
29+
30+
func (hdr *Header) encodeInto(buf *bytes.Buffer, msgType MessageType, remainingLength int32) error {
2131
if !hdr.QosLevel.IsValid() {
2232
return badQosError
2333
}
2434
if !msgType.IsValid() {
2535
return badMsgTypeError
2636
}
2737

28-
buf := new(bytes.Buffer)
2938
val := byte(msgType) << 4
3039
val |= (boolToByte(hdr.DupFlag) << 3)
3140
val |= byte(hdr.QosLevel) << 1
3241
val |= boolToByte(hdr.Retain)
3342
buf.WriteByte(val)
3443
encodeLength(remainingLength, buf)
35-
_, err := w.Write(buf.Bytes())
36-
return err
44+
return nil
3745
}
3846

3947
func (hdr *Header) Decode(r io.Reader) (msgType MessageType, remainingLength int32, err error) {
@@ -105,12 +113,14 @@ func writeMessage(w io.Writer, msgType MessageType, hdr *Header, payloadBuf *byt
105113
return msgTooLongError
106114
}
107115

108-
err := hdr.Encode(w, msgType, int32(totalPayloadLength))
116+
buf := new(bytes.Buffer)
117+
err := hdr.encodeInto(buf, msgType, int32(totalPayloadLength))
109118
if err != nil {
110119
return err
111120
}
112121

113-
_, err = w.Write(payloadBuf.Bytes())
122+
buf.Write(payloadBuf.Bytes())
123+
_, err = w.Write(buf.Bytes())
114124

115125
return err
116126
}

0 commit comments

Comments
 (0)