Как вы выполняете функцию в Go и возвращаете ее время выполнения в миллисекундах?
Как вы выполняете функцию в Go и возвращаете ее время выполнения в миллисекундах?
Ответ 1
Используйте инструмент 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 для запуска тестов.
Ответ 2
Go 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() откладывается до конца. Это не атомно-часы точные, из-за журнальных заявлений, но если вам нужна более высокая точность, этот вид шаблона является одним из преимуществ сильного болота Go.
EDIT:
В этом ответе изначально использовался API устаревших пакетов времени. Воспроизведено здесь только для исторического значения:
Для использования версии 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)
}
Ответ 3
Возможно, вы также можете использовать длительность (истекшее) для этого... выглядит немного приятнее.
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())
}
Ответ 4
Другим простым способом может быть:
import (
"fmt"
"time"
)
start := time.Now()
// some computation
elapsed := time.Since(start)
fmt.Println(elapsed)
который выведет что-то вроде 359.684612ms
Ответ 5
В временном пакете существует несколько параметров для timestamping и timers. См. Документацию здесь: http://golang.org/pkg/time/