From 26060e1824b523760ce8c6a6794b34b20c3f220d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Fri, 29 May 2020 10:48:22 +0200 Subject: [PATCH] connect: reduce allocations when building SET command (#1111) * connect: reduce allocations when building SET command * handleParams: use strings.Builder instead of direct []byte --- connection.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/connection.go b/connection.go index 0c280443d..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 params []string + var cmdSet strings.Builder 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.Len() == 0 { + // Heuristic: 29 chars for each other key=value to reduce reallocations + cmdSet.Grow(4 + len(param) + 1 + len(val) + 30*(len(mc.cfg.Params)-1)) + cmdSet.WriteString("SET ") + } else { + cmdSet.WriteByte(',') + } + cmdSet.WriteString(param) + cmdSet.WriteByte('=') + cmdSet.WriteString(val) } } - if len(params) > 0 { - err = mc.exec("SET " + strings.Join(params, ",")) + if cmdSet.Len() > 0 { + err = mc.exec(cmdSet.String()) if err != nil { return }