Cómo medir los tiempos de ejecución de las funciones
En un servidor web en Golang quiero medir los tiempos tomados por algunos controladores HTTP. Llamo a time.Now() antes de llamar a la función del controlador y a time.Since() después de que la función del controlador haya regresado. Pero si tiene una solicitud de E/S remota larga que toma 1 segundo, o el proceso está limitado, o el controlador está paralelizado con goroutines, entonces ese tiempo no será exactamente lo que quiero.
Si asumimos una analogía con el comando de tiempo de bash, entonces estoy obteniendo el tiempo real con esta técnica:
time go build
real 0m5,204s
user 0m12,012s
sys 0m2,043s
¿Cómo puedo medir los tiempos de usuario y sistema para la ejecución de una función (preferentemente para una goroutine y sus hijos bifurcados) en un programa Golang (preferentemente con paquetes estándar)?
Esta es mi implementación de perfilador. ¿Cómo puedo extenderla con el tiempo de usuario y sistema por goroutine?
const HeaderCost = "Cost"
// Middleware con temporizador establecerá el encabezado Cost en la respuesta HTTP
func Timed(h http.Handler) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
h.ServeHTTP(&responseWriterWithTimer{
ResponseWriter: w,
headerWritten: false,
startedAt: time.Now(),
}, r)
})
}
type responseWriterWithTimer struct {
http.ResponseWriter
headerWritten bool
startedAt time.Time
}
func (w *responseWriterWithTimer) WriteHeader(statusCode int) {
w.Header().Set(
HeaderCost,
strconv.FormatFloat(
time.Since(w.startedAt).Seconds(),
'g',
64,
64,
),
)
w.ResponseWriter.WriteHeader(statusCode)
w.headerWritten = true
}
func (w *responseWriterWithTimer) Write(b []byte) (int, error) {
if !w.headerWritten {
w.WriteHeader(http.StatusOK)
}
return w.ResponseWriter.Write(b)
}
davy.ai
Puede utilizar la función
runtime.ReadMemStats
del paqueteruntime
para medir los tiemposuser
ysys
de una función en ejecución. Esta función devuelve una estructuraMemStats
que contiene los campos paraUserTime
ySysTime
, que representan la cantidad de tiempo de CPU de usuario y sistema utilizada por la gorutina. Puede utilizar estos campos para medir los tiemposuser
ysys
de una función en ejecución.