Maison > développement back-end > Golang > Pourquoi mesurer le temps d'exécution d'une fonction avec « defer » dans Go renvoie-t-il parfois zéro ?

Pourquoi mesurer le temps d'exécution d'une fonction avec « defer » dans Go renvoie-t-il parfois zéro ?

Patricia Arquette
Libérer: 2024-11-23 04:10:15
original
826 Les gens l'ont consulté

Why does measuring function execution time with `defer` in Go sometimes return zero?

Comment mesurer le temps d'exécution d'une fonction dans Go

Lors du suivi des performances d'une fonction Go, il est courant d'utiliser l'instruction defer pour différer l'exécution d'une fonction jusqu'au retour de la fonction environnante. Cependant, dans certains cas, différer l'exécution d'une fonction pour imprimer son temps d'exécution peut entraîner une sortie inattendue de valeur nulle.

Considérez le code suivant :

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 cet exemple , l'instruction defer tente d'imprimer le temps écoulé depuis que la fonction a été initialement appelée. Cependant, comme les arguments de la fonction différée sont évalués au moment où la fonction est différée, l'appel time.Now() est effectué immédiatement lorsque start est attribué, ce qui entraîne une heure de début qui ne reflète pas le temps réel nécessaire à l'exécution de la fonction. fonction.

Pour résoudre ce problème, le code peut être modifié comme suit :

defer func() { fmt.Println(time.Now().Sub(start)) }()
Copier après la connexion

En encapsulant l'appel fmt.Println dans une fonction anonyme, les arguments de la Les fonctions différées sont évaluées lorsque la fonction est exécutée, garantissant ainsi que l'heure de début est capturée correctement.

De plus, l'utilisation d'une fonction réutilisable pour encapsuler la logique de synchronisation peut simplifier davantage le code :

func timeFunction(f func()) {
    start := time.Now()
    f()
    fmt.Println(time.Now().Sub(start))
}
Copier après la connexion

Cette fonction peut alors être utilisée comme suit :

timeFunction(func() {
    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
})
Copier après la connexion

En comprenant le fonctionnement des fonctions différées dans Go, les développeurs peuvent mesurer efficacement le temps d'exécution des fonctions et optimiser leur performance.

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