在 Golang 中使用“模板”包生成动态网页到客户端需要太多时间
Posted
技术标签:
【中文标题】在 Golang 中使用“模板”包生成动态网页到客户端需要太多时间【英文标题】:It takes too much time when using "template" package to generate a dynamic web page to client in Golang 【发布时间】:2015-04-11 15:59:10 【问题描述】:使用template
包生成动态网页给客户端的速度太慢了。
测试代码如下,golang 1.4.1
http.Handle("/js/", (http.FileServer(http.Dir(webpath))))
http.Handle("/css/", (http.FileServer(http.Dir(webpath))))
http.Handle("/img/", (http.FileServer(http.Dir(webpath))))
http.HandleFunc("/test", TestHandler)
func TestHandler(w http.ResponseWriter, r *http.Request)
Log.Info("Entering TestHandler ...")
r.ParseForm()
filename := NiConfig.webpath + "/test.html"
t, err := template.ParseFiles(filename)
if err != nil
Log.Error("template.ParseFiles err = %v", err)
t.Execute(w, nil)
根据日志,我发现t.Execute(w, nil)
用了3秒左右,不知道为什么用了这么多时间。我还尝试了Apache服务器测试test.html
,它响应非常快。
【问题讨论】:
我认为我们需要更多信息才能给出好的答案。 您可以尝试通过添加import _ "net/http/pprof"
来分析它以查看它在做什么。请参阅blog.golang.org/profiling-go-programs 了解更多信息。
【参考方案1】:
您不应该在每次处理请求时都解析模板!
读取文件、解析其内容和构建模板存在明显的时间延迟。此外,由于模板不会改变(变化的部分应该是参数!)您只需要读取和解析一次模板。 每次处理请求时解析和创建模板也会在内存中生成大量值,然后将其丢弃(因为它们没有被重用),从而为垃圾收集器提供额外的工作。
在你的应用程序启动时解析模板,将其存储在一个变量中,你只需要在请求进来时执行模板。例如:
var t *template.Template
func init()
filename := NiConfig.webpath + "/test.html"
t = template.Must(template.ParseFiles(filename))
http.HandleFunc("/test", TestHandler)
func TestHandler(w http.ResponseWriter, r *http.Request)
Log.Info("Entering TestHandler ...")
// Template is ready, just Execute it
if err := t.Execute(w, nil); err != nil
log.Printf("Failed to execute template: %v", err)
【讨论】:
知道了!非常感谢!以上是关于在 Golang 中使用“模板”包生成动态网页到客户端需要太多时间的主要内容,如果未能解决你的问题,请参考以下文章