Defer Timing : obtenir une mesure précise du temps en Go
En Go, l'instruction defer nous permet de retarder l'exécution d'une fonction jusqu'à ce que le la fonction environnante revient. Bien que cette fonctionnalité puisse être bénéfique, elle peut créer des défis lorsque l'on tente de mesurer le temps d'exécution d'une fonction.
Considérez la fonction suivante :
func sum() { start := time.Now() //expecting to print non zero value but always gets 0 defer fmt.Println(time.Now().Sub(start)) sum := 0 for i := 1; i < 101; i++ { sum += i } time.Sleep(1 * time.Second) fmt.Println(sum) }
Dans cette fonction, nous avons l'intention d'imprimer le temps nécessaire pour exécuter la boucle interne. Cependant, notre attente n'est pas satisfaite et la sortie affiche toujours 0.
La raison de cet écart réside dans l'évaluation des arguments de la fonction différée. Les arguments sont évalués lorsque la fonction est différée, et non lorsqu'elle est réellement exécutée. Au moment où la fonction différée s'exécute (lorsque la fonction environnante revient), la boucle est déjà terminée, ce qui donne un temps écoulé de 0.
Pour résoudre ce problème et obtenir un temps écoulé non nul, nous pouvons modifiez le code comme suit :
defer func() { fmt.Println(time.Now().Sub(start)) }()
En encapsulant l'appel de fonction différé dans une fonction anonyme supplémentaire, nous différons l'exécution du code qui évalue l'heure de début. Cela garantit qu'il est évalué et mis à jour juste avant l'exécution de l'appel de fonction différé.
Cette approche nous permet de mesurer avec précision le temps d'exécution de la boucle interne :
start time: 2023-02-07 16:25:42.39378981 +0000 UTC end time: 2023-02-07 16:25:42.40889486 +0000 UTC time taken: 15.11010505ns
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!