web-dev-qa-db-fra.com

Existe-t-il un moyen efficace de calculer le temps d'exécution en golang?

Je cherche le meilleur moyen de calculer le temps d'exécution au fur et à mesure.

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

    time.Sleep(time.Second * 2)

    //something doing here

    elapsed := time.Since(start)
    fmt.Printf("page took %s", elapsed)
}

Le code ci-dessus fonctionne bien.

Mais lorsque j'utilise des modèles, je dois le réécrire pour chaque fonction de modèle.

Existe-t-il un moyen efficace de calculer le temps d’exécution, y compris les modèles?

8
Özgür Yalçın

Si vous chronométrez une fonction entière, vous pouvez utiliser defer pour éliminer une partie du code répétitif.

func elapsed(what string) func() {
    start := time.Now()
    return func() {
        fmt.Printf("%s took %v\n", what, time.Since(start))
    }
}

func main() {
    defer elapsed("page")()
    time.Sleep(time.Second * 2)
}

exemple de terrain de jeu

23
ThunderCat

La solution fournie par Cerise est parfaite. 


De plus, si vous ne voulez pas transmettre explicitement le nom de la fonction, vous pouvez le faire comme suit:

func SomeFunction(list *[]string) {
    defer TimeTrack(time.Now())
    // Do whatever you want.
}

func TimeTrack(start time.Time) {
    elapsed := time.Since(start)

    // Skip this function, and fetch the PC and file for its parent.
    pc, _, _, _ := runtime.Caller(1)

    // Retrieve a function object this functions parent.
    funcObj := runtime.FuncForPC(pc)

    // Regex to extract just the function name (and not the module path).
    runtimeFunc := regexp.MustCompile(`^.*\.(.*)$`)
    name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1")

    log.Println(fmt.Sprintf("%s took %s", name, elapsed))
}

En conséquence, vous obtiendrez: 

SomeFunction took 15.483µs


Pour plus d'informations, reportez-vous à cet article: Go Function Tracing

Partagez les connaissances. :)

5
Mohsin

Méthode efficace pour calculer le temps d'exécution en golang

Vous pouvez facilement obtenir le délai d'exécution sur votre console à l'aide d'une fonction de report

les fonctions de report s'exécutent même si le code reçoit une erreur afin que vous obteniez toujours le temps d'exécution.

forfait de temps est utilisé pour obtenir le décalage horaire.

func main() {
    now := time.Now()
    defer func() {
        fmt.Println(time.Now().Sub(now))
    }()

    // Here you can do whatever you want
}

Ou vous pouvez utiliser ce code

func main() {
        now := time.Now()
        defer func() {
            fmt.Println(time.Since(now))
        }()

        // Here you can do whatever you want
    }

vérifiez le code dans Playground for more. J'ai ajouté quelques fonctionnalités pour récupérer d'une erreur en même temps, imprimer le temps d'exécution, même s'il s'agissait d'une erreur de panique.

2
ASHWIN RAJEEV

Utiliser la fonction init

package main

import (
    "fmt"
    "time"
)

var start time.Time

func init() {
    start = time.Now()
}

func getChars(s string) {
    for _, c := range s {
        fmt.Printf("%c at time %v\n", c, time.Since(start))
        time.Sleep(10 * time.Millisecond)
    }
}

func main() {
    fmt.Println("main execution started at time", time.Since(start))

    getChars("Hello")

    fmt.Println("\nmain execution stopped at time", time.Since(start))
}
1
Uday Hiwarale