tiempos register programacion funcion estructurada condicional time timer benchmarking go

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.