fix: dns resolution taking long and add caching options (#8)
This commit is contained in:
159
internal/resolver/resolver_bench_test.go
Normal file
159
internal/resolver/resolver_bench_test.go
Normal file
@@ -0,0 +1,159 @@
|
||||
package resolver
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func BenchmarkResolveAddr_CacheHit(b *testing.B) {
|
||||
r := New(100 * time.Millisecond)
|
||||
addr := "127.0.0.1"
|
||||
|
||||
// pre-populate cache
|
||||
r.ResolveAddr(addr)
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
r.ResolveAddr(addr)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkResolveAddr_CacheMiss(b *testing.B) {
|
||||
r := New(10 * time.Millisecond) // short timeout for faster benchmarks
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
// use different addresses to avoid cache hits
|
||||
addr := fmt.Sprintf("127.0.0.%d", i%256)
|
||||
r.ClearCache() // clear cache to force miss
|
||||
r.ResolveAddr(addr)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkResolveAddr_NoCache(b *testing.B) {
|
||||
r := New(10 * time.Millisecond)
|
||||
r.SetNoCache(true)
|
||||
addr := "127.0.0.1"
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
r.ResolveAddr(addr)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkResolvePort_CacheHit(b *testing.B) {
|
||||
r := New(100 * time.Millisecond)
|
||||
|
||||
// pre-populate cache
|
||||
r.ResolvePort(80, "tcp")
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
r.ResolvePort(80, "tcp")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkResolvePort_WellKnown(b *testing.B) {
|
||||
r := New(100 * time.Millisecond)
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
r.ClearCache()
|
||||
r.ResolvePort(443, "tcp")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkGetServiceName(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
getServiceName(80, "tcp")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkGetServiceName_NotFound(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
getServiceName(12345, "tcp")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkResolveAddrsParallel_10(b *testing.B) {
|
||||
benchmarkResolveAddrsParallel(b, 10)
|
||||
}
|
||||
|
||||
func BenchmarkResolveAddrsParallel_100(b *testing.B) {
|
||||
benchmarkResolveAddrsParallel(b, 100)
|
||||
}
|
||||
|
||||
func BenchmarkResolveAddrsParallel_1000(b *testing.B) {
|
||||
benchmarkResolveAddrsParallel(b, 1000)
|
||||
}
|
||||
|
||||
func benchmarkResolveAddrsParallel(b *testing.B, count int) {
|
||||
addrs := make([]string, count)
|
||||
for i := 0; i < count; i++ {
|
||||
addrs[i] = fmt.Sprintf("127.0.%d.%d", i/256, i%256)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
r := New(10 * time.Millisecond)
|
||||
r.ResolveAddrsParallel(addrs)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkConcurrentResolveAddr(b *testing.B) {
|
||||
r := New(100 * time.Millisecond)
|
||||
addr := "127.0.0.1"
|
||||
|
||||
// pre-populate cache
|
||||
r.ResolveAddr(addr)
|
||||
|
||||
b.ResetTimer()
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
for pb.Next() {
|
||||
r.ResolveAddr(addr)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkConcurrentResolvePort(b *testing.B) {
|
||||
r := New(100 * time.Millisecond)
|
||||
|
||||
// pre-populate cache
|
||||
r.ResolvePort(80, "tcp")
|
||||
|
||||
b.ResetTimer()
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
for pb.Next() {
|
||||
r.ResolvePort(80, "tcp")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkGetCacheSize(b *testing.B) {
|
||||
r := New(100 * time.Millisecond)
|
||||
|
||||
// populate with some entries
|
||||
for i := 0; i < 100; i++ {
|
||||
r.ResolvePort(i+1, "tcp")
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
r.GetCacheSize()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkClearCache(b *testing.B) {
|
||||
r := New(100 * time.Millisecond)
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
// populate and clear
|
||||
for j := 0; j < 10; j++ {
|
||||
r.ResolvePort(j+1, "tcp")
|
||||
}
|
||||
r.ClearCache()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user