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  }