Use sync.Pool for bytes.Buffer in template renderingUnverified
57d67c7 parent: e7ec090 modified
internal/server/server.go +11 -2 | @@ -54,6 +54,12 @@ var oauthScopes = []string{ | ||
| 54 | 54 | "rpc:app.bsky.actor.getProfile?aud=*", |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | +var bufPool = sync.Pool{ | |
| 58 | + New: func() any { | |
| 59 | + return new(bytes.Buffer) | |
| 60 | + }, | |
| 61 | +} | |
| 62 | + | |
| 57 | 63 | func splitString(s, sep string) []string { |
| 58 | 64 | return strings.Split(s, sep) |
| 59 | 65 | } |
| @@ -604,8 +610,11 @@ func (s *Server) render(w http.ResponseWriter, r *http.Request, name string, dat | ||
| 604 | 610 | return |
| 605 | 611 | } |
| 606 | 612 | |
| 607 | - var buf bytes.Buffer | |
| 608 | - if err := s.templates.ExecuteTemplate(&buf, name, data); err != nil { | |
| 613 | + buf := bufPool.Get().(*bytes.Buffer) | |
| 614 | + buf.Reset() | |
| 615 | + defer bufPool.Put(buf) | |
| 616 | + | |
| 617 | + if err := s.templates.ExecuteTemplate(buf, name, data); err != nil { | |
| 609 | 618 | s.logger.Error("template error", "error", err, "template", name) |
| 610 | 619 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| 611 | 620 | return |
| @@ -54,6 +54,12 @@ var oauthScopes = []string{ | |||
| 54 | "rpc:app.bsky.actor.getProfile?aud=*", | 54 | "rpc:app.bsky.actor.getProfile?aud=*", |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | +var bufPool = sync.Pool{ | ||
| 58 | + New: func() any { | ||
| 59 | + return new(bytes.Buffer) | ||
| 60 | + }, | ||
| 61 | +} | ||
| 62 | + | ||
| 57 | func splitString(s, sep string) []string { | 63 | func splitString(s, sep string) []string { |
| 58 | return strings.Split(s, sep) | 64 | return strings.Split(s, sep) |
| 59 | } | 65 | } |
| @@ -604,8 +610,11 @@ func (s *Server) render(w http.ResponseWriter, r *http.Request, name string, dat | |||
| 604 | return | 610 | return |
| 605 | } | 611 | } |
| 606 | 612 | ||
| 607 | - var buf bytes.Buffer | 613 | + buf := bufPool.Get().(*bytes.Buffer) |
| 608 | - if err := s.templates.ExecuteTemplate(&buf, name, data); err != nil { | 614 | + buf.Reset() |
| 615 | + defer bufPool.Put(buf) | ||
| 616 | + | ||
| 617 | + if err := s.templates.ExecuteTemplate(buf, name, data); err != nil { | ||
| 609 | s.logger.Error("template error", "error", err, "template", name) | 618 | s.logger.Error("template error", "error", err, "template", name) |
| 610 | http.Error(w, err.Error(), http.StatusInternalServerError) | 619 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| 611 | return | 620 | return |