Se tarda demasiado tiempo al usar el paquete “plantilla” para generar una página web dinámica para el cliente en golang

Es muy lento cuando se usa el paquete de template para generar una página web dinámica para el cliente.

Código de prueba de la siguiente manera, 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) } 

De acuerdo con el registro, encontré que tardó unos 3 segundos en t.Execute(w, nil) , no sé por qué usa tanto tiempo. También probé el servidor Apache para probar test.html , respondió muy rápido.

¡No debe analizar las plantillas cada vez que atiende una solicitud!

Hay un retraso de tiempo significativo para leer un archivo, analizar su contenido y crear la plantilla. Además, como las plantillas no cambian (¡las partes variables deben ser parámetros!), Solo tiene que leer y analizar una plantilla una vez.
Además, el análisis y la creación de la plantilla cada vez que se atiende una solicitud genera muchos valores en la memoria que luego se descartan (porque no se vuelven a usar) lo que da trabajo adicional al recolector de elementos no utilizados.

Analice las plantillas cuando comience la aplicación, guárdelas en una variable y solo deberá ejecutar la plantilla cuando entre una solicitud. Por ejemplo:

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