Je cherche le meilleur moyen de calculer le temps d'exécution au fur et à mesure.
func main() {
start := time.Now()
time.Sleep(time.Second * 2)
//something doing here
elapsed := time.Since(start)
fmt.Printf("page took %s", elapsed)
}
Le code ci-dessus fonctionne bien.
Mais lorsque j'utilise des modèles, je dois le réécrire pour chaque fonction de modèle.
Existe-t-il un moyen efficace de calculer le temps d’exécution, y compris les modèles?
Si vous chronométrez une fonction entière, vous pouvez utiliser defer
pour éliminer une partie du code répétitif.
func elapsed(what string) func() {
start := time.Now()
return func() {
fmt.Printf("%s took %v\n", what, time.Since(start))
}
}
func main() {
defer elapsed("page")()
time.Sleep(time.Second * 2)
}
La solution fournie par Cerise est parfaite.
De plus, si vous ne voulez pas transmettre explicitement le nom de la fonction, vous pouvez le faire comme suit:
func SomeFunction(list *[]string) {
defer TimeTrack(time.Now())
// Do whatever you want.
}
func TimeTrack(start time.Time) {
elapsed := time.Since(start)
// Skip this function, and fetch the PC and file for its parent.
pc, _, _, _ := runtime.Caller(1)
// Retrieve a function object this functions parent.
funcObj := runtime.FuncForPC(pc)
// Regex to extract just the function name (and not the module path).
runtimeFunc := regexp.MustCompile(`^.*\.(.*)$`)
name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1")
log.Println(fmt.Sprintf("%s took %s", name, elapsed))
}
En conséquence, vous obtiendrez:
SomeFunction took 15.483µs
Pour plus d'informations, reportez-vous à cet article: Go Function Tracing
Partagez les connaissances. :)
Vous pouvez facilement obtenir le délai d'exécution sur votre console à l'aide d'une fonction de report
les fonctions de report s'exécutent même si le code reçoit une erreur afin que vous obteniez toujours le temps d'exécution.
forfait de temps est utilisé pour obtenir le décalage horaire.
func main() {
now := time.Now()
defer func() {
fmt.Println(time.Now().Sub(now))
}()
// Here you can do whatever you want
}
Ou vous pouvez utiliser ce code
func main() {
now := time.Now()
defer func() {
fmt.Println(time.Since(now))
}()
// Here you can do whatever you want
}
vérifiez le code dans Playground for more. J'ai ajouté quelques fonctionnalités pour récupérer d'une erreur en même temps, imprimer le temps d'exécution, même s'il s'agissait d'une erreur de panique.
Utiliser la fonction init
package main
import (
"fmt"
"time"
)
var start time.Time
func init() {
start = time.Now()
}
func getChars(s string) {
for _, c := range s {
fmt.Printf("%c at time %v\n", c, time.Since(start))
time.Sleep(10 * time.Millisecond)
}
}
func main() {
fmt.Println("main execution started at time", time.Since(start))
getChars("Hello")
fmt.Println("\nmain execution stopped at time", time.Since(start))
}