es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Puede utilizar la función runtime.ReadMemStats del paquete runtime para medir los tiempos user y sys de una función en ejecución. Esta función devuelve una estructura MemStats que contiene los campos para UserTime y SysTime, que representan la cantidad de tiempo de CPU de usuario y sistema utilizada por la gorutina. Puede utilizar estos campos para medir los tiempos user y sys de una función en ejecución.

Comments are closed.