Làm thế nào để bạn thời gian một hàm trong Go và trả về thời gian chạy của nó theo mili giây?Làm thế nào để bạn thời gian một hàm trong Go và trả về thời gian chạy của nó theo mili giây?
Trả lời
Sử dụng gói Go testing
để chuẩn chức năng. Ví dụ,
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)
}
Output:
500000000 4.22 ns/op
Bạn cũng có thể sử dụng lệnh Go gotest để chạy điểm chuẩn.
Có một số tùy chọn để định thời gian và hẹn giờ trong gói thời gian. Xem tài liệu tại đây: http://golang.org/pkg/time/
Bạn cũng có thể sử dụng gói hồ sơ: http://golang.org/pkg/runtime/pprof/ – TJD
Tôi đã xem tài liệu đó, nhưng không có ví dụ nào được sử dụng. Tôi chỉ cần đi 'timer: = timer.Time() sau đó timer.Stop()'? Điều đó dường như không hoạt động. Và làm cách nào để truy cập thời gian bằng mili giây? –
Go's defer
làm cho điều này tầm thường.
Trong Go 1.x, xác định các chức năng sau:
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))
}
Sau đó, bạn sẽ có được Squeaky Clean một dòng thời gian trôi qua tin nhắn đăng nhập:
func someFunction() {
defer un(trace("SOME_ARBITRARY_STRING_SO_YOU_CAN_KEEP_TRACK"))
//do a bunch of stuff here...
}
Sự kỳ diệu thông minh là các dấu vết() được gọi ở đầu hàm, nhưng hàm un() được trả về cuối. Nó không phải là đồng hồ nguyên tử chính xác, do các báo cáo tường trình, nhưng nếu bạn cần độ chính xác hơn, kiểu mẫu này là một trong những điểm mạnh dẻo dai của Go.
EDIT:
Câu trả lời này ban đầu được sử dụng API gói thời gian cũ. Sao chép vào đây để chỉ giá trị lịch sử:
Để sử dụng w/Tới phiên bản trước 12-01-2011 hàng tuần:
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)
}
Có lẽ bạn cũng có thể sử dụng một Thời gian (trôi) cho việc này ... trông đẹp hơn một chút.
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())
}
Một cách dễ dàng có thể là:
import (
"fmt"
"time"
)
start := time.Now()
// some computation
elapsed := time.Since(start)
fmt.Println(elapsed)
đó sẽ ra cái gì đó như 359.684612ms
Đó là nano giây. – Awn