time - register - ¿Cómo se sincroniza una función en Go y se devuelve su tiempo de ejecución en milisegundos?
time function labview (5)
El defer
de Go hace que esto sea trivial.
En Go 1.x, defina las siguientes funciones:
func trace(s string) (string, time.Time) {
log.Println("START:", s)
return s, time.Now()
}
func un(s string, startTime time.Time) {
endTime := time.Now()
log.Println(" END:", s, "ElapsedTime in seconds:", endTime.Sub(startTime))
}
Después de eso, obtienes mensajes de registro de tiempo transcurridos de una línea Squeaky Clean:
func someFunction() {
defer un(trace("SOME_ARBITRARY_STRING_SO_YOU_CAN_KEEP_TRACK"))
//do a bunch of stuff here...
}
La magia inteligente es que se llama al trace () al comienzo de la función, pero el un () se difiere hasta el final. No es un reloj atómico preciso, debido a las declaraciones de registro, pero si necesita más precisión, este tipo de patrón es uno de los buenos puntos fuertes de mal gusto de Go.
EDITAR:
Esta respuesta usó originalmente el paquete de tiempo heredado API. Reproducido aquí solo para el valor histórico:
Para usar versiones de w / Go antes del 12-01-2011 semanalmente:
func trace(s string) (string, int64) {
log.Println("START:", s)
return s, time.Nanoseconds()
}
func un(s string, startTime int64) {
endTime := time.Nanoseconds()
log.Println(" END:", s, "ElapsedTime in seconds:", float32(endTime-startTime)/1E9)
}
¿Cómo se sincroniza una función en Go y se devuelve su tiempo de ejecución en milisegundos?
Hay varias opciones de sellado de tiempo y temporizadores en el paquete de tiempo. Consulte la documentación aquí: http://golang.org/pkg/time/
Otra manera fácil puede ser:
import (
"fmt"
"time"
)
start := time.Now()
// some computation
elapsed := time.Since(start)
fmt.Println(elapsed)
que dará como resultado algo así como 359.684612ms
Quizás también puedas usar una Duración (transcurrida) para esto ... se ve un poco mejor.
func trace(s string) (string, time.Time) {
log.Printf("trace start: %s/n", s)
return s, time.Now()
}
func un(s string, startTime time.Time) {
elapsed := time.Since(startTime)
log.Printf("trace end: %s, elapsed %f secs/n", s, elapsed.Seconds())
}
Use el paquete de testing
Go para comparar la función. Por ejemplo,
package main
import (
"fmt"
"testing"
)
// the function to be benchmarked
func Function(n int) int64 {
n64 := int64(n)
return n64 * n64
}
func BenchmarkFunction(b *testing.B) {
n := 42
for i := 0; i < b.N; i++ {
_ = Function(n)
}
}
func main() {
br := testing.Benchmark(BenchmarkFunction)
fmt.Println(br)
}
Salida:
500000000 4.22 ns/op
También puede usar el comando Go gotest para ejecutar benchmarks.