5 ответов:
Используйте 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 для запуска тестов.
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)) }После этого вы получите скрипуче чистую одну строку истекшего времени сообщения журнала:
Хитрая магия заключается в том, что trace() вызывается в начале функции, а un() откладывается до конца. Это не точно по атомным часам, из-за логарифмических утверждений, но если вам нужна большая точность, этот тип паттерна-один из лучших в Go силы.func someFunction() { defer un(trace("SOME_ARBITRARY_STRING_SO_YOU_CAN_KEEP_TRACK")) //do a bunch of stuff here... }Правка:
Этот ответ первоначально использовал устаревший API пакета time. Воспроизведено здесь только для исторической ценности:
Для использования в версиях w / Go до 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) }
Возможно, вы также можете использовать длительность (прошедшую) для этого...выглядит немного лучше.
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()) }
Другим простым способом может быть:
import ( "fmt" "time" ) start := time.Now() // some computation elapsed := time.Since(start) fmt.Println(elapsed)Который выведет что-то вроде
359.684612ms
В пакете time есть несколько вариантов для отметок времени и таймеров. Смотрите документацию здесь: http://golang.org/pkg/time/
Comments