From 720fc62919b100a4493b60971cea6f5f864de8e6 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Tue, 24 Jan 2023 16:49:33 +0100 Subject: [PATCH] Create and use a strings.Builder pool This will probably make no big difference, but let's give it a try --- pkgs/builderpool/builderPool.go | 23 +++++++++++++++++++++++ pkgs/highlighting/highlighting.go | 5 +++-- postsDb.go | 16 +++++++++++----- reactions.go | 5 +++-- telegram.go | 5 +++-- uiComponents.go | 4 +++- webmention.go | 4 +++- 7 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 pkgs/builderpool/builderPool.go diff --git a/pkgs/builderpool/builderPool.go b/pkgs/builderpool/builderPool.go new file mode 100644 index 0000000..a7e1059 --- /dev/null +++ b/pkgs/builderpool/builderPool.go @@ -0,0 +1,23 @@ +package builderpool + +import ( + "strings" + "sync" +) + +var builderPool = sync.Pool{ + New: func() any { + return new(strings.Builder) + }, +} + +func Get() *strings.Builder { + return builderPool.Get().(*strings.Builder) +} + +func Put(bufs ...*strings.Builder) { + for _, buf := range bufs { + buf.Reset() + builderPool.Put(buf) + } +} diff --git a/pkgs/highlighting/highlighting.go b/pkgs/highlighting/highlighting.go index fe9728a..c40beea 100644 --- a/pkgs/highlighting/highlighting.go +++ b/pkgs/highlighting/highlighting.go @@ -2,13 +2,13 @@ package highlighting import ( "io" - "strings" "github.com/yuin/goldmark" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/renderer" "github.com/yuin/goldmark/renderer/html" "github.com/yuin/goldmark/util" + "go.goblog.app/app/pkgs/builderpool" "github.com/alecthomas/chroma/v2" chromahtml "github.com/alecthomas/chroma/v2/formatters/html" @@ -60,7 +60,8 @@ func (r *htmlRenderer) renderFencedCodeBlock(w util.BufWriter, source []byte, no n := node.(*ast.FencedCodeBlock) // Read code block content. - var buf strings.Builder + buf := builderpool.Get() + defer builderpool.Put(buf) for _, line := range n.Lines().Sliced(0, n.Lines().Len()) { buf.Write(line.Value(source)) } diff --git a/postsDb.go b/postsDb.go index e1f2a36..5a7f131 100644 --- a/postsDb.go +++ b/postsDb.go @@ -12,6 +12,7 @@ import ( "github.com/araddon/dateparse" "github.com/samber/lo" "go.goblog.app/app/pkgs/bufferpool" + "go.goblog.app/app/pkgs/builderpool" ) func (a *goBlog) checkPost(p *post, new bool) (err error) { @@ -206,7 +207,8 @@ func (db *database) savePost(p *post, o *postCreationOptions) error { db.pcm.Lock() defer db.pcm.Unlock() // Build SQL - var sqlBuilder strings.Builder + sqlBuilder := builderpool.Get() + defer builderpool.Put(sqlBuilder) var sqlArgs = []any{dbNoCache} // Start transaction sqlBuilder.WriteString("begin;") @@ -335,7 +337,8 @@ func (db *database) replacePostParam(path, param string, values []string) error db.pcm.Lock() defer db.pcm.Unlock() // Build SQL - var sqlBuilder strings.Builder + sqlBuilder := builderpool.Get() + defer builderpool.Put(sqlBuilder) var sqlArgs = []any{dbNoCache} // Start transaction sqlBuilder.WriteString("begin;") @@ -385,7 +388,8 @@ type postsRequestConfig struct { } func buildPostsQuery(c *postsRequestConfig, selection string) (query string, args []any) { - var queryBuilder strings.Builder + queryBuilder := builderpool.Get() + defer builderpool.Put(queryBuilder) // Selection queryBuilder.WriteString("select ") queryBuilder.WriteString(selection) @@ -519,7 +523,8 @@ func (d *database) loadPostParameters(posts []*post, parameters ...string) (err } // Build query sqlArgs := make([]any, 0) - var queryBuilder strings.Builder + queryBuilder := builderpool.Get() + defer builderpool.Put(queryBuilder) queryBuilder.WriteString("select path, parameter, value from post_parameters where") // Paths queryBuilder.WriteString(" path in (") @@ -691,7 +696,8 @@ group by name; func (db *database) usesOfMediaFile(names ...string) (counts []int, err error) { sqlArgs := []any{dbNoCache} - var nameValues strings.Builder + nameValues := builderpool.Get() + defer builderpool.Put(nameValues) for i, n := range names { if i > 0 { nameValues.WriteString(", ") diff --git a/reactions.go b/reactions.go index fd69e2c..25dad76 100644 --- a/reactions.go +++ b/reactions.go @@ -5,10 +5,10 @@ import ( "errors" "io" "net/http" - "strings" "github.com/dgraph-io/ristretto" "github.com/samber/lo" + "go.goblog.app/app/pkgs/builderpool" "go.goblog.app/app/pkgs/contenttype" ) @@ -107,7 +107,8 @@ func (a *goBlog) getReactionsFromDatabase(path string) (map[string]int, error) { // Get reactions res, err, _ := a.reactionsSfg.Do(path, func() (any, error) { // Build query - var sqlBuf strings.Builder + sqlBuf := builderpool.Get() + defer builderpool.Put(sqlBuf) sqlArgs := []any{} sqlBuf.WriteString("select reaction, count from reactions where path=? and reaction in (") sqlArgs = append(sqlArgs, path) diff --git a/telegram.go b/telegram.go index b3a081d..e4cdc88 100644 --- a/telegram.go +++ b/telegram.go @@ -5,9 +5,9 @@ import ( "log" "net/url" "strconv" - "strings" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" + "go.goblog.app/app/pkgs/builderpool" ) func (a *goBlog) initTelegram() { @@ -135,7 +135,8 @@ func (tg *configTelegram) generateHTML(title, fullURL, shortURL string) (html st if !tg.enabled() { return "" } - var message strings.Builder + message := builderpool.Get() + defer builderpool.Put(message) if title != "" { message.WriteString(tgbotapi.EscapeText(tgbotapi.ModeHTML, title)) message.WriteString("\n\n") diff --git a/uiComponents.go b/uiComponents.go index 3b2ea1b..926fd6a 100644 --- a/uiComponents.go +++ b/uiComponents.go @@ -6,6 +6,7 @@ import ( "time" "github.com/samber/lo" + "go.goblog.app/app/pkgs/builderpool" "go.goblog.app/app/pkgs/htmlbuilder" ) @@ -64,7 +65,8 @@ func (a *goBlog) renderSummary(hb *htmlbuilder.HtmlBuilder, bc *configBlog, p *p } // Show link to full post hb.WriteElementOpen("p") - var prefix strings.Builder + prefix := builderpool.Get() + defer builderpool.Put(prefix) if len(photos) > 0 { // Contains photos prefix.WriteString("🖼️") diff --git a/webmention.go b/webmention.go index 770cd40..b3683f7 100644 --- a/webmention.go +++ b/webmention.go @@ -8,6 +8,7 @@ import ( "strings" "time" + "go.goblog.app/app/pkgs/builderpool" "go.goblog.app/app/pkgs/contenttype" ) @@ -230,7 +231,8 @@ type webmentionsRequestConfig struct { } func buildWebmentionsQuery(config *webmentionsRequestConfig) (query string, args []any) { - var queryBuilder strings.Builder + queryBuilder := builderpool.Get() + defer builderpool.Put(queryBuilder) queryBuilder.WriteString("select id, source, target, url, created, title, content, author, status from webmentions ") if config != nil { queryBuilder.WriteString("where 1")