gpt4 book ai didi

http - Golang使用 "template"包生成动态网页给客户端耗时太长

转载 作者:IT王子 更新时间:2023-10-29 00:39:32 24 4
gpt4 key购买 nike

使用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,它响应非常快。

最佳答案

您不应该在每次处理请求时都解析模板!

读取文件、解析其内容和构建模板有很长的时间延迟。此外,由于模板不会更改(变化的部分应该是参数!),您只需读取和解析一次模板。
此外,每次为请求提供服务时解析和创建模板都会在内存中生成大量值,然后将其丢弃(因为它们未被重用),从而为垃圾收集器提供额外的工作。

当你的应用程序启动时解析模板,将它存储在一个变量中,你只需要在有请求时执行模板。例如:

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)
}
}

关于http - Golang使用 "template"包生成动态网页给客户端耗时太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28451675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com