آشنایی با Benchmark Test در گولنگ

توسط mrbardia72
زمان خواندن ~1 دقیقه
آشنایی با  Benchmark Test در گولنگ

introduction to Benchmark🔵

🟢 بنچمارک (Benchmark) به زبانی ساده، به معنای استاندارد و یا مجموعه‌ای از استانداردها است که می‌تواند معیاری برای اندازه گیری و سنجش عملکرد یک قطعه، یک ویژگی، یک برنامه و یا یک قابلیت در حوزه‌های مختلف، قرار گیرد.

 A Simple Benchmark Test🔵

🟢 در Go ، تست های Benchmark را می توان همراه با unit test  نوشت.

 🟢  توابع Benchmark باید با پیشوند "Benchmark"  نوشته شود و به دنبال آن نام تابع ، به همان روشی که برای unit test  استفاده می کنیم

🟢  اما اجرا آنها متقاوت هست

👇🏻❌👇🏻به تکه کد زیر توجه کنید👇🏻❌👇🏻

//main.go
func Calculate(x int) (result int) {
    result = x + 2
    return result
}

func main() {
    fmt.Println("Hello World")
}
main_test.go//
func BenchmarkCalculate(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Calculate(2)
    }
}
>/pre>

🟢 این توابع با نام Benchmark شروع می شوند

🟢 ازکتابخانه testing برای اجرا استفاده می کند

🟢 مقدار b.N هر بار افزایش می یابد تا زمانی که  معیاری از stability برسد.

🟢 هر Benchmark باید کد را تحت آزمایش b.N بار اجرا کند.

👇🏻👇🏻❌نحوه اجرا❌👇🏻👇🏻

.=gophers$ go test -bench

goos: darwin

goarch: amd64

BenchmarkCalculate-8    2000000000               0.30 ns/op

PASS

ok      _/Users/bardia/Documents/Projects/tutorials/golang/go-testing-tutorial  0.643s

🟢 اجرای کد فوق 

 .=go test -bench

کامند فوق تمام  متد Benchmark ها رو اجرا می کنه

 The -run Flag🔵

func TestCalculate(t *testing.T) {
    fmt.Println("Test Calculate")
    expected := 4
    result := Calculate(2)
    if expected != result {
        t.Error("Failed")
    }
}

func BenchmarkCalculate(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Calculate(2)
    }
}

func TestOther(t *testing.T) {
    fmt.Println("Testing something else")
    fmt.Println("This shouldn't run with -run=calc")
}

❌کد فوق رو درنظر بگیرید

🟢برای اجرای متد TestCalculate به صورت زیر عمل می کنیم

 .=go test -run=Calculate -bench

🟢برای اجرای متد BenchmarkCalculate به صورت زیر عمل می کنیم

 .=go test -run=Bench -bench

🟢برای اجرای جداگانه تست هامون از -run Flag استفاده می کنیم

func benchmarkCalculate(input int, b *testing.B) {
    for n := 0; n < b.N; n++ {
        Calculate(input)
    }
}

func BenchmarkCalculate100(b *testing.B)         { benchmarkCalculate(100, b) }
func BenchmarkCalculateNegative100(b *testing.B) { benchmarkCalculate(-100, b) }
func BenchmarkCalculateNegative1(b *testing.B)   { benchmarkCalculate(-1, b) }
go-benchmarking-tutorial go test -run=Bench -bench=.
goos: darwin
goarch: amd64
BenchmarkCalculate100-8                 2000000000               0.29 ns/op
BenchmarkCalculateNegative100-8         2000000000               0.29 ns/op
BenchmarkCalculateNegative1-8           2000000000               0.29 ns/op
PASS
ok      _/Users/elliot/Documents/Projects/Tutorialedge/go-benchmarking-tutorial 1.850s

 Increasing the Complexity. 🔵

🟢 به طور معمول ، شما می خواهید برنامه های خود را با انواع ورودی های مشخص محک بزنید. شما می خواهید ویژگی های performance برنامه خود را تحت تعدادی سناریوی مجزا و واقعی اندازه گیری کنید.

🟢ما از تابع محاسبه مثال قبلی خود استفاده خواهیم کرد و این بار مجموعه ای از benchmarks های مختلف را اضافه خواهیم کرد که ورودی های مختلف  را  آزمایش کنند

🟢 بنابراین ، در اینجا ما 3 عملکرد مشخص Benchmark را ایجاد کرده ایم که با انواع مختلف ورودی ، فراخوانی Benchmark  را می خوانند. 

🟢این به ما اجازه می دهد که بین عملکردهای مختلف تفاوت عملکردی داشته باشیم