2011-12-02 18 views

Trả lời

28

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.

+0

Đó là nano giây. – Awn

1

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/

+0

Bạn cũng có thể sử dụng gói hồ sơ: http://golang.org/pkg/runtime/pprof/ – TJD

+0

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? –

28

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

Mẹo dành cho Noah Heldman để đề xuất chỉnh sửa. Không chắc chắn tại sao nó bị từ chối, nhưng sẽ chỉnh sửa ngay. – amattn

+0

Slick và đủ tốt cho nhu cầu của tôi. –

+0

mẹo trì hoãn, nhưng không đơn giản như Python @ – whi

10

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

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

Các vấn đề liên quan