From a8f5ce12c51513b6e9ebfac8945e9c4371107601 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 18 Nov 2014 07:53:33 +0700 Subject: [PATCH] Trying to reduce memory allocation. logQueryArgs is called even when using the default discardLogger. This allocates quite a bit of memory. Created a default dlogger instance and avoid logging code when that's our logger. I couldn't think of a better implementation without touching the Logger interface. On 100 000 inserts, this brought the allocation down to 58MB from 122MB. It should also result in some small performance gains. --- conn.go | 26 +++++++++++++++----------- logger.go | 3 +++ query.go | 4 ++++ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/conn.go b/conn.go index c0aa36a4..7bf22c23 100644 --- a/conn.go +++ b/conn.go @@ -99,7 +99,7 @@ func Connect(config ConnConfig) (c *Conn, err error) { if c.config.Logger != nil { c.logger = c.config.Logger } else { - c.logger = &discardLogger{} + c.logger = dlogger } if c.config.User == "" { @@ -190,8 +190,10 @@ func Connect(config ConnConfig) (c *Conn, err error) { } case readyForQuery: c.rxReadyForQuery(r) - c.logger = &connLogger{logger: c.logger, pid: c.Pid} - c.logger.Info("Connection established") + if c.logger != dlogger { + c.logger = &connLogger{logger: c.logger, pid: c.Pid} + c.logger.Info("Connection established") + } err = c.loadPgTypes() if err != nil { @@ -640,14 +642,16 @@ func (c *Conn) Exec(sql string, arguments ...interface{}) (commandTag CommandTag startTime := time.Now() c.lastActivityTime = startTime - defer func() { - if err == nil { - endTime := time.Now() - c.logger.Info("Exec", "sql", sql, "args", logQueryArgs(arguments), "time", endTime.Sub(startTime), "commandTag", commandTag) - } else { - c.logger.Error("Exec", "sql", sql, "args", logQueryArgs(arguments), "error", err) - } - }() + if c.logger != dlogger { + defer func() { + if err == nil { + endTime := time.Now() + c.logger.Info("Exec", "sql", sql, "args", logQueryArgs(arguments), "time", endTime.Sub(startTime), "commandTag", commandTag) + } else { + c.logger.Error("Exec", "sql", sql, "args", logQueryArgs(arguments), "error", err) + } + }() + } if err = c.sendQuery(sql, arguments...); err != nil { return diff --git a/logger.go b/logger.go index acfac5fd..d7c7d974 100644 --- a/logger.go +++ b/logger.go @@ -19,6 +19,9 @@ type Logger interface { type discardLogger struct{} +// default discardLogger instance +var dlogger = &discardLogger{} + func (l *discardLogger) Debug(msg string, ctx ...interface{}) {} func (l *discardLogger) Info(msg string, ctx ...interface{}) {} func (l *discardLogger) Warn(msg string, ctx ...interface{}) {} diff --git a/query.go b/query.go index e4f24a32..862e842a 100644 --- a/query.go +++ b/query.go @@ -68,6 +68,10 @@ func (rows *Rows) close() { rows.closed = true + if rows.logger == dlogger { + return + } + if rows.err == nil { endTime := time.Now() rows.logger.Info("Query", "sql", rows.sql, "args", logQueryArgs(rows.args), "time", endTime.Sub(rows.startTime), "rowCount", rows.rowCount)