Skip to content

Commit 36bb281

Browse files
committed
Optimizing MySQLReadPacket from 4494.5k to 446 ns/op
1 parent 30e1195 commit 36bb281

3 files changed

Lines changed: 24 additions & 6 deletions

File tree

dbshield/dbms/io_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func TestReadWrite(t *testing.T) {
2323
}
2424

2525
func BenchmarkReadPacket(b *testing.B) {
26+
var buf [1024]byte
2627
for i := 0; i < b.N; i++ {
27-
s := bytes.Buffer{}
28-
s.WriteString("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
29-
ReadPacket(&s)
28+
s := bytes.NewReader(buf[:])
29+
ReadPacket(s)
3030
}
3131
}

dbshield/dbms/mysql.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import (
55
"crypto/tls"
66
"io"
77
"net"
8+
"sync"
89
"time"
910

1011
"github.com/nim4/DBShield/dbshield/logger"
1112
"github.com/nim4/DBShield/dbshield/sql"
1213
)
1314

15+
const maxPayloadLen = 1<<24 - 1
16+
1417
//MySQL DBMS
1518
type MySQL struct {
1619
client net.Conn
@@ -185,11 +188,17 @@ func (m *MySQL) handleLogin() (success bool, err error) {
185188
return
186189
}
187190

191+
//buffer pool for MySQLReadPacket
192+
var dataPool = sync.Pool{
193+
New: func() interface{} {
194+
return make([]byte, maxPayloadLen)
195+
},
196+
}
197+
188198
//MySQLReadPacket handles decoding packet len and reading payload
189199
func MySQLReadPacket(src io.Reader) ([]byte, error) {
190-
const maxPayloadLen = 1<<24 - 1
191-
192-
data := make([]byte, maxPayloadLen)
200+
data := dataPool.Get().([]byte)
201+
defer dataPool.Put(data)
193202
n, err := src.Read(data)
194203
if err != nil && err != io.EOF {
195204
return nil, err

dbshield/dbms/mysql_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dbms_test
22

33
import (
4+
"bytes"
45
"errors"
56
"io"
67
"testing"
@@ -155,3 +156,11 @@ func TestGetUsernameDB(t *testing.T) {
155156
t.Error("Expected empty username & db name got", string(u), string(d))
156157
}
157158
}
159+
160+
func BenchmarkMySQLReadPacket(b *testing.B) {
161+
var buf [1024]byte
162+
for i := 0; i < b.N; i++ {
163+
s := bytes.NewReader(buf[:])
164+
dbms.MySQLReadPacket(s)
165+
}
166+
}

0 commit comments

Comments
 (0)