github.com/Cloud-Foundations/Dominator@v0.3.4/lib/html/benchmark.go (about) 1 package html 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "net/http" 8 "runtime" 9 "time" 10 11 "github.com/Cloud-Foundations/Dominator/lib/wsyscall" 12 ) 13 14 func createBenchmarkData() (*BenchmarkData, error) { 15 runtime.LockOSThread() 16 bd := BenchmarkData{} 17 err := wsyscall.Getrusage(wsyscall.RUSAGE_THREAD, &bd.startRusage) 18 if err != nil { 19 return nil, err 20 } 21 bd.startTime = time.Now() 22 return &bd, nil 23 } 24 25 func (bd *BenchmarkData) write(w *bufio.Writer) error { 26 var stopRusage wsyscall.Rusage 27 durationReal := time.Since(bd.startTime) 28 err := wsyscall.Getrusage(wsyscall.RUSAGE_THREAD, &stopRusage) 29 if err != nil { 30 fmt.Fprintf(w, 31 "<br><font color=\"grey\">Render time: real: %s wbuf: %d B</font>\n", 32 durationReal, w.Buffered()) 33 return err 34 } 35 runtime.UnlockOSThread() 36 var durationUser, durationSys int64 37 durationUser = (stopRusage.Utime.Sec - bd.startRusage.Utime.Sec) * 1000000 38 durationUser += stopRusage.Utime.Usec - bd.startRusage.Utime.Usec 39 durationSys = (stopRusage.Stime.Sec - bd.startRusage.Stime.Sec) * 1000000 40 durationSys += stopRusage.Stime.Usec - bd.startRusage.Stime.Usec 41 fmt.Fprintf(w, 42 "<br><font color=\"grey\">Render time: real: %s, user: %d us, sys: %d us wbuf: %d B</font>\n", 43 durationReal, durationUser, durationSys, w.Buffered()) 44 return nil 45 } 46 47 func benchmarkedHandler(handler func(io.Writer, 48 *http.Request)) func(http.ResponseWriter, *http.Request) { 49 return func(w http.ResponseWriter, req *http.Request) { 50 bd, _ := CreateBenchmarkData() 51 writer := bufio.NewWriter(w) 52 defer writer.Flush() 53 defer fmt.Fprintln(writer, "</body>") 54 handler(writer, req) 55 bd.Write(writer) 56 } 57 }