2011-12-02 11 views

Odpowiedz

28

Skorzystaj z pakietu Go testing, aby porównać tę funkcję. Na przykład,

package main 

import (
    "fmt" 
    "testing" 
) 

// the function to be benchmarked 
func Function(n int) int64 { 
    n64 := int64(n) 
    return n64 * n64 
} 

func BenchmarkFunction(b *testing.B) { 
    n := 42 
    for i := 0; i < b.N; i++ { 
     _ = Function(n) 
    } 
} 

func main() { 
    br := testing.Benchmark(BenchmarkFunction) 
    fmt.Println(br) 
} 

wyjściowa:

500000000   4.22 ns/op 

Można również użyć polecenia Go gotest uruchomić wzorców.

+0

To jest nanosekundowy kolega. – Awn

1

Istnieje kilka opcji dla znaczników czasu i timerów w pakiecie czasu. Zobacz dokumentację tutaj: http://golang.org/pkg/time/

+0

Można również skorzystać z pakietu profilowania: http://golang.org/pkg/runtime/pprof/ – TJD

+0

Widziałem tę dokumentację, ale nie używano żadnych przykładów. Czy po prostu uruchomię 'timer: = timer.Time(), a następnie timer.Stop()'? To chyba nie działa. A jak mam uzyskać dostęp do czasu w milisekundach? –

28

Go to defer czyni to trywialnym.

Przejdź 1.x zdefiniować następujące funkcje:

func trace(s string) (string, time.Time) { 
    log.Println("START:", s) 
    return s, time.Now() 
} 

func un(s string, startTime time.Time) { 
    endTime := time.Now() 
    log.Println(" END:", s, "ElapsedTime in seconds:", endTime.Sub(startTime)) 
} 

Po tym, można dostać wypucowane jednej linii komunikatów dziennika upłynął czas:

func someFunction() { 
    defer un(trace("SOME_ARBITRARY_STRING_SO_YOU_CAN_KEEP_TRACK")) 

    //do a bunch of stuff here... 
} 

Pomysłowa magia jest to, że ślad() jest wywoływane na początku funkcji, ale un() jest odroczone do końca. Nie jest to dokładny zegar atomowy, ze względu na wyciągi z dziennika, ale jeśli potrzebujesz większej dokładności, ten rodzaj wzoru jest jednym z dobrych atutów Go's marshmallowy.

EDYTOWANIE:

Ta odpowiedź pierwotnie służyła za pakiet API czasu przeszłego. Powielana tutaj tylko wartość historyczną:

Do stosowania w/Idź wersjach wcześniejszych 12-01-2011 tygodniowy:

func trace(s string) (string, int64) { 
    log.Println("START:", s) 
    return s, time.Nanoseconds() 
} 

func un(s string, startTime int64) { 
    endTime := time.Nanoseconds() 
    log.Println(" END:", s, "ElapsedTime in seconds:", float32(endTime-startTime)/1E9) 
} 
+1

Hat Tip do Noah Heldman za sugerowanie zmiany. Nie wiem, dlaczego został odrzucony, ale wkrótce się edytuje. – amattn

+0

Zręczny i wystarczająco dobry dla moich potrzeb. –

+0

trik odroczenia, ale nie tak prosty jak Python @ – whi

10

Może również użyć trwania (który upłynął) za to wygląda ... trochę ładniej.

func trace(s string) (string, time.Time) { 
    log.Printf("trace start: %s\n", s) 
    return s, time.Now() 
} 

func un(s string, startTime time.Time) { 
    elapsed := time.Since(startTime) 
    log.Printf("trace end: %s, elapsed %f secs\n", s, elapsed.Seconds()) 
} 
8

Innym sposobem może być:

import (
    "fmt" 
    "time" 
) 

start := time.Now() 
// some computation 
elapsed := time.Since(start) 
fmt.Println(elapsed) 

który wyświetli coś jak 359.684612ms

Powiązane problemy