Further performance optimization
This commit is contained in:
@@ -175,14 +175,21 @@ type reqStartKeyT struct{}
|
||||
|
||||
var reqStartKey = reqStartKeyT{}
|
||||
|
||||
// elapsedMS returns the milliseconds since the request entered ServeHTTP.
|
||||
func elapsedMS(r *http.Request) int64 {
|
||||
// requestStart returns when the request entered ServeHTTP, or now if unknown.
|
||||
func requestStart(r *http.Request) time.Time {
|
||||
if start, ok := r.Context().Value(reqStartKey).(time.Time); ok {
|
||||
return time.Since(start).Milliseconds()
|
||||
return start
|
||||
}
|
||||
return 0
|
||||
return time.Now()
|
||||
}
|
||||
|
||||
// renderTimer is embedded in template data. The footer calls RenderMS while
|
||||
// the template executes, so the time includes the page's own rendering (and
|
||||
// the header's maintenance widget), not just the work before it.
|
||||
type renderTimer struct{ start time.Time }
|
||||
|
||||
func (t renderTimer) RenderMS() int64 { return time.Since(t.start).Milliseconds() }
|
||||
|
||||
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
r = r.WithContext(context.WithValue(r.Context(), reqStartKey, time.Now()))
|
||||
|
||||
@@ -407,7 +414,7 @@ func (h *handler) serveDir(w http.ResponseWriter, r *http.Request, urlPath, fsPa
|
||||
if editMode {
|
||||
t = editTmpl
|
||||
}
|
||||
data.RenderMS = elapsedMS(r)
|
||||
data.renderTimer = renderTimer{requestStart(r)}
|
||||
if err := t.ExecuteTemplate(w, "layout", data); err != nil {
|
||||
log.Printf("template error: %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user