Как вы рассчитываете функцию в Go и возвращаете время ее выполнения в миллисекундах? - PullRequest
36 голосов
/ 02 декабря 2011

Как вы рассчитываете функцию в Go и возвращаете время ее выполнения в миллисекундах?

Ответы [ 5 ]

32 голосов
/ 03 декабря 2011

Go's defer делает это тривиальным.

В Go 1.x определите следующие функции:

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

После этого вы получите Squeaky Clean сообщения журнала за истекшее время одной строки:

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

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

Умная магия заключается в том, что trace () вызывается в начале функции, но un () откладывается до конца.Это не точные атомные часы, из-за операторов лога, но если вам нужна большая точность, этот тип паттерна является одной из сильных сторон Го.

РЕДАКТИРОВАТЬ:

Этот ответ первоначально использовалсяУстаревшее время пакета API.Воспроизводится здесь только для исторической ценности:

Для использования с версиями до 12-01-2011 еженедельно:

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)
}
30 голосов
/ 02 декабря 2011

Используйте пакет Go testing для тестирования функции. Например,

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

Выход:

500000000            4.22 ns/op

Вы также можете использовать команду Go gotest для запуска тестов.

10 голосов
/ 24 апреля 2015

Другим простым способом может быть:

import (
    "fmt"
    "time"
)

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

, который выдаст что-то вроде 359.684612ms

10 голосов
/ 20 марта 2013

Возможно, вы также можете использовать длительность (истек) для этого ... выглядит немного лучше.

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())
}
1 голос
/ 02 декабря 2011

В пакете времени есть несколько вариантов отметок времени и таймеров.Смотрите документацию здесь: http://golang.org/pkg/time/

...