Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-11-17 14:49:02
original
682 Les gens l'ont consulté

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)
}
Copier après la connexion

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)) }()
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal