Mesure du temps d'exécution d'une fonction avec des fonctions différées dans Go
Dans Go, les fonctions différées fournissent un mécanisme pratique pour retarder l'exécution d'une fonction jusqu'à ce que la fonction environnante revient. Cependant, l'impression du temps nécessaire à l'exécution d'une fonction différée renvoie parfois des résultats inattendus.
Problème :
Considérez la fonction sum() suivante qui tente de calculer le temps d'exécution en utilisant une fonction différée :
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) }
L'exécution de ce code entraîne l'impression de 0 pour l'exécution time.
Solution :
Le problème se pose car les arguments de la fonction différée sont évalués lorsque la fonction est différée, et non lorsqu'elle est exécutée. Pour résoudre ce problème, utilisez une fonction anonyme pour capturer la valeur actuelle de start et différer l'exécution de cette fonction anonyme :
defer func() { fmt.Println(time.Now().Sub(start)) }()
En utilisant une fonction anonyme, la valeur de start est évaluée au moment de l'exécution différée. la fonction est exécutée.
Autres considérations :
Si vous avez besoin de plus de personnalisation ou de flexibilité, envisagez d'encapsuler le logique de synchronisation dans une fonction réutilisable. Cette approche offre une solution plus modulaire et réutilisable.
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!