Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Golang uygulamalarında, kıyaslama amaçlı olarak testleri çalıştıp performans sonuçlarını görmek için bench komutunu kullanabilirsiniz. Geçmiş sonuçları yenileriyle karşılaştırmak için benchstat veya benchcmp komutlarını da kullanabilirsiniz. Aşağıdaki örnekte, yyy-mm-dd biçimini doğrulamak için iki farklı fonksiyon kullanacağız ve her ikisi içinde karşılaştırma testleri yazacağız. High Performance Go Workshop başlığı altındaki çok değerli olan yazıyı da okumanızı tavsiye ederim.


Örnek komutlar


// All benchmarks in the project
go test -v -bench=. -benchmem ./...
go test -v -bench=. ./... -benchmem

// All benchmarks in the package
go test -v -bench=. -benchmem ./internal/validator/

Kod


// internal/validator/datetime.go

package validator

import (
"regexp"
"time"
)

// DateRegex validates date format `yyyy-mm-dd`.
func DateRegex(v string) bool {
return regexp.MustCompile(`([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))`).MatchString(v)
}

// TimeParse validates date format `yyyy-mm-dd`.
func TimeParse(v string) bool {
if _ , e := time.Parse("2006-01-02", v); e != nil {
return false
}
return true
}

Tek girdili test


// internal/validator/datetime_test.go

package validator

import (
"testing"
)

func BenchmarkDateRegex(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = DateRegex("2020-01-01")
}
}

func BenchmarkTimeParse(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = TimeParse("2020-01-01")
}
}

Çalıştırma


$ go test -v -bench=. -benchmem ./internal/validator/

BenchmarkDateRegex-4 133645 8860 ns/op 7047 B/op 62 allocs/op
BenchmarkTimeParse-4 7844908 150 ns/op 0 B/op 0 allocs/op

Çeşitli girişli test


// internal/validator/datetime_test.go

package validator

import (
"testing"
)

func benchmarkDateRegex(v string, b *testing.B) {
for i := 0; i < b.N; i++ {
_ = DateRegex(v)
}
}

func BenchmarkDateRegex_1(b *testing.B) { benchmarkDateRegex("", b) }
func BenchmarkDateRegex_2(b *testing.B) { benchmarkDateRegex(" ", b) }
func BenchmarkDateRegex_3(b *testing.B) { benchmarkDateRegex("2020-01-01", b) }

Çalıştırma


$ go test -v -bench=. -benchmem ./internal/validator/

BenchmarkDateRegex_1-4 122085 8483 ns/op 7032 B/op 62 allocs/op
BenchmarkDateRegex_2-4 132746 8445 ns/op 7032 B/op 62 allocs/op
BenchmarkDateRegex_3-4 132991 8802 ns/op 7048 B/op 62 allocs/op

Performans ölçümü


Burada geçmiş sonuçları mevcut sonuçlarla karşılaştırıyoruz. go get golang.org/x/perf/cmd/benchstat ve go get golang.org/x/tools/cmd/benchcmp komutlarını çalıştırımayı unutmayın.


$ go test -v -bench=. -benchmem ./internal/validator/ > old.out

// Do some changes to your code

$ go test -v -bench=. -benchmem ./internal/validator/ > new.out

Ölçüm


$ benchstat old.out new.out

name old time/op new time/op delta
DateRegex-4 8.98µs ± 0% 8.75µs ± 0% ~ (p=1.000 n=1+1)
TimeParse-4 151ns ± 0% 152ns ± 0% ~ (p=1.000 n=1+1)

name old alloc/op new alloc/op delta
DateRegex-4 7.05kB ± 0% 7.05kB ± 0% ~ (p=1.000 n=1+1)
TimeParse-4 0.00B 0.00B ~ (all equal)

name old allocs/op new allocs/op delta
DateRegex-4 62.0 ± 0% 62.0 ± 0% ~ (all equal)
TimeParse-4 0.00 0.00 ~ (all equal)

$ benchcmp old.out new.out

benchmark old ns/op new ns/op delta
BenchmarkDateRegex-4 8978 8752 -2.52%
BenchmarkTimeParse-4 151 152 +0.66%

benchmark old allocs new allocs delta
BenchmarkDateRegex-4 62 62 +0.00%
BenchmarkTimeParse-4 0 0 +0.00%

benchmark old bytes new bytes delta
BenchmarkDateRegex-4 7052 7046 -0.09%
BenchmarkTimeParse-4 0 0 +0.00%