Question

Je veux profil mes benchmarks générés par go test -c, mais le go tool pprof a besoin d'un fichier de profil généralement généré dans la fonction principale comme ce:

func main() {
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            log.Fatal(err)
        }
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    }

Comment puis-je créer un fichier de profil au sein de mes benchmarks ?

Était-ce utile?

La solution

Comme décrit dans http://golang.org/cmd/go/#hdr-Description_of_testing_flags vous pouvez spécifier le fichier de profil en utilisant le drapeau -cpuprofile.

Par exemple

go test -cpuprofile cpu.out

Autres conseils

Utilisez le -cpuprofile drapeau à go test comme documenté à http://golang.org/cmd/go/#hdr-Description_of_testing_flags

Cet article explique comment profiler les benchmarks avec un exemple : Profilage de référence avec pprof.

Le benchmark suivant simule certains travaux du processeur.

package main

import (
    "math/rand"
    "testing"
)

func BenchmarkRand(b *testing.B) {
    for n := 0; n < b.N; n++ {
        rand.Int63()
    }
}

Pour générer un profil de processeur pour le test d'évaluation, exécutez :

go test -bench=BenchmarkRand -benchmem -cpuprofile profile.out

Le -memprofile et -blockprofile les indicateurs peuvent être utilisés pour générer une allocation de mémoire et bloquer des profils d’appel.

Pour analyser le profil, utilisez l'outil Go :

go tool pprof profile.out
(pprof) top
Showing nodes accounting for 1.16s, 100% of 1.16s total
Showing top 10 nodes out of 22
      flat  flat%   sum%        cum   cum%
     0.41s 35.34% 35.34%      0.41s 35.34%  sync.(*Mutex).Unlock
     0.37s 31.90% 67.24%      0.37s 31.90%  sync.(*Mutex).Lock
     0.12s 10.34% 77.59%      1.03s 88.79%  math/rand.(*lockedSource).Int63
     0.08s  6.90% 84.48%      0.08s  6.90%  math/rand.(*rngSource).Uint64 (inline)
     0.06s  5.17% 89.66%      1.11s 95.69%  math/rand.Int63
     0.05s  4.31% 93.97%      0.13s 11.21%  math/rand.(*rngSource).Int63
     0.04s  3.45% 97.41%      1.15s 99.14%  benchtest.BenchmarkRand
     0.02s  1.72% 99.14%      1.05s 90.52%  math/rand.(*Rand).Int63
     0.01s  0.86%   100%      0.01s  0.86%  runtime.futex
         0     0%   100%      0.01s  0.86%  runtime.allocm

Le goulot d'étranglement dans ce cas est le mutex, causé par la synchronisation de la source par défaut dans math/rand.

D'autres présentations de profil et formats de sortie sont également possibles, par ex. tree.Taper help pour plus d'options.

Notez que tout code d'initialisation avant la boucle de référence sera également profilé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top