Maison >développement back-end >Golang >Comment pouvons-nous mesurer avec précision le temps d'exécution des fonctions à l'aide de l'instruction « defer » de Go ?

Comment pouvons-nous mesurer avec précision le temps d'exécution des fonctions à l'aide de l'instruction « defer » de Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-17 14:49:02806parcourir

How Can We Accurately Measure Function Execution Time Using Go's `defer` Statement?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn