From 5748e046ff76bcf1021609f75521b32b4d63b09f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Fri, 22 May 2020 17:09:17 +0200 Subject: [PATCH 1/2] connect: reduce allocations when building SET command --- connection.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/connection.go b/connection.go index 0c280443d..6a613a504 100644 --- a/connection.go +++ b/connection.go @@ -47,7 +47,7 @@ type mysqlConn struct { // Handles parameters set in DSN after the connection is established func (mc *mysqlConn) handleParams() (err error) { - var params []string + var cmdSet []byte for param, val := range mc.cfg.Params { switch param { // Charset: character_set_connection, character_set_client, character_set_results @@ -64,14 +64,23 @@ func (mc *mysqlConn) handleParams() (err error) { return } - // Other system vars + // Other system vars accumulated in a single SET command default: - params = append(params, param+"="+val) + if cmdSet == nil { + // Heuristic: 29 chars for each other key=value to reduce reallocations + cmdSet = make([]byte, 0, 4+len(param)+1+len(val)+30*(len(mc.cfg.Params)-1)) + cmdSet = append(cmdSet, "SET "...) + } else { + cmdSet = append(cmdSet, ',') + } + cmdSet = append(cmdSet, param...) + cmdSet = append(cmdSet, '=') + cmdSet = append(cmdSet, val...) } } - if len(params) > 0 { - err = mc.exec("SET " + strings.Join(params, ",")) + if cmdSet != nil { + err = mc.exec(string(cmdSet)) if err != nil { return } From acb481bfdbbdb9715ef6eec559e3f6b342873789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Wed, 27 May 2020 17:21:22 +0200 Subject: [PATCH 2/2] handleParams: use strings.Builder instead of direct []byte --- connection.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/connection.go b/connection.go index 6a613a504..d1d8b29fe 100644 --- a/connection.go +++ b/connection.go @@ -47,7 +47,7 @@ type mysqlConn struct { // Handles parameters set in DSN after the connection is established func (mc *mysqlConn) handleParams() (err error) { - var cmdSet []byte + var cmdSet strings.Builder for param, val := range mc.cfg.Params { switch param { // Charset: character_set_connection, character_set_client, character_set_results @@ -66,21 +66,21 @@ func (mc *mysqlConn) handleParams() (err error) { // Other system vars accumulated in a single SET command default: - if cmdSet == nil { + if cmdSet.Len() == 0 { // Heuristic: 29 chars for each other key=value to reduce reallocations - cmdSet = make([]byte, 0, 4+len(param)+1+len(val)+30*(len(mc.cfg.Params)-1)) - cmdSet = append(cmdSet, "SET "...) + cmdSet.Grow(4 + len(param) + 1 + len(val) + 30*(len(mc.cfg.Params)-1)) + cmdSet.WriteString("SET ") } else { - cmdSet = append(cmdSet, ',') + cmdSet.WriteByte(',') } - cmdSet = append(cmdSet, param...) - cmdSet = append(cmdSet, '=') - cmdSet = append(cmdSet, val...) + cmdSet.WriteString(param) + cmdSet.WriteByte('=') + cmdSet.WriteString(val) } } - if cmdSet != nil { - err = mc.exec(string(cmdSet)) + if cmdSet.Len() > 0 { + err = mc.exec(cmdSet.String()) if err != nil { return }