Maison  >  Article  >  développement back-end  >  Pourquoi la mesure du temps d'exécution avec Defer dans Go donne-t-elle toujours zéro ?

Pourquoi la mesure du temps d'exécution avec Defer dans Go donne-t-elle toujours zéro ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-17 16:37:01352parcourir

Why Does Measuring Execution Time with Defer in Go Always Yield Zero?

Mesurer le temps d'exécution en Go : résoudre le mystère du report

Les instructions Defer attendent l'achèvement d'une fonction avant d'exécuter leurs fonctions associées. Cependant, l'impression du temps d'exécution de la fonction suivante à l'aide de defer donne toujours zéro :

func sum() {
    start := time.Now()

    // Expected 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)
}

Problème :
defer évalue les arguments de la fonction différée lorsque la fonction contenant les diffère . Par conséquent, le démarrage est évalué immédiatement, avant la boucle ou le sommeil.

Solution :
Pour mesurer le temps écoulé avec précision, évaluez time.Now() à l'intérieur de la fonction différée :

defer func() { fmt.Println(time.Now().Sub(start)) }()

Ce faisant, la différence de temps est calculée lorsque la fonction différée s'exécute, garantissant ainsi une précision résultats.

Conseil : Pensez à utiliser une fonction réutilisable pour encapsuler la logique de synchronisation pour une mesure plus facile et plus cohérente.

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