Skip to content

Commit 7baff57

Browse files
authored
Reduce allocations in recvMessage() by re-using a buffer (#47)
* Reduce allocations in recvMessage() by re-using a buffer * Remove unused fields in connection struct * Add basic benchcmp
2 parents a1167f8 + bc3b4e8 commit 7baff57

File tree

1 file changed

+30
-28
lines changed

1 file changed

+30
-28
lines changed

connection.go

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import (
4040
"database/sql/driver"
4141
"encoding/binary"
4242
"fmt"
43-
"io"
4443
"net"
4544
"net/url"
4645
"os"
@@ -68,12 +67,11 @@ type connection struct {
6867
backendPID uint32
6968
cancelKey uint32
7069
transactionState byte
71-
authState int32
7270
usePreparedStmts bool
71+
scratch [512]byte
7372
sessionID string
7473
serverTZOffset string
7574
sessMutex sync.Mutex
76-
inputStream io.Reader
7775
}
7876

7977
// Begin - Begin starts and returns a new transaction. (DEPRECATED)
@@ -180,40 +178,44 @@ func newConnection(connString string) (*connection, error) {
180178
}
181179

182180
func (v *connection) recvMessage() (msgs.BackEndMsg, error) {
183-
msgHeader := make([]byte, 5)
181+
msgHeader := v.scratch[:5]
184182

185-
for {
186-
var err error
183+
var err error
187184

188-
if err = v.readAll(msgHeader); err != nil {
189-
return nil, err
190-
}
185+
if err = v.readAll(msgHeader); err != nil {
186+
return nil, err
187+
}
191188

192-
msgSize := int(binary.BigEndian.Uint32(msgHeader[1:]) - 4)
189+
msgSize := int(binary.BigEndian.Uint32(msgHeader[1:]) - 4)
193190

194-
msgBytes := make([]byte, msgSize)
191+
msgBytes := v.scratch[5:]
195192

196-
if msgSize > 0 {
197-
if err = v.readAll(msgBytes); err != nil {
198-
return nil, err
199-
}
193+
var y []byte
194+
if msgSize > 0 {
195+
if msgSize <= len(msgBytes) {
196+
y = msgBytes[:msgSize]
197+
} else {
198+
y = make([]byte, msgSize)
200199
}
201-
202-
bem, err := msgs.CreateBackEndMsg(msgHeader[0], msgBytes)
203-
204-
if err != nil {
200+
if err = v.readAll(y); err != nil {
205201
return nil, err
206202
}
203+
}
207204

208-
// Print the message to stdout (for debugging purposes)
209-
if _, drm := bem.(*msgs.BEDataRowMsg); !drm {
210-
connectionLogger.Debug("<- " + bem.String())
211-
} else {
212-
connectionLogger.Trace("<- " + bem.String())
213-
}
205+
bem, err := msgs.CreateBackEndMsg(msgHeader[0], y)
206+
207+
if err != nil {
208+
return nil, err
209+
}
214210

215-
return bem, nil
211+
// Print the message to stdout (for debugging purposes)
212+
if _, drm := bem.(*msgs.BEDataRowMsg); !drm {
213+
connectionLogger.Debug("<- " + bem.String())
214+
} else {
215+
connectionLogger.Trace("<- " + bem.String())
216216
}
217+
218+
return bem, nil
217219
}
218220

219221
func (v *connection) sendMessage(msg msgs.FrontEndMsg) error {
@@ -226,7 +228,7 @@ func (v *connection) sendMessage(msg msgs.FrontEndMsg) error {
226228
}
227229

228230
if result == nil {
229-
sizeBytes := make([]byte, 4)
231+
sizeBytes := v.scratch[:4]
230232
binary.BigEndian.PutUint32(sizeBytes, uint32(len(msgBytes)+4))
231233

232234
_, result = v.conn.Write(sizeBytes)
@@ -393,7 +395,7 @@ func (v *connection) readAll(buf []byte) error {
393395
func (v *connection) initializeSSL(sslFlag string) error {
394396
v.sendMessage(&msgs.FESSLMsg{})
395397

396-
buf := make([]byte, 1)
398+
buf := v.scratch[:1]
397399

398400
err := v.readAll(buf)
399401

0 commit comments

Comments
 (0)