fix: dns resolution taking long and add caching options (#8)

This commit is contained in:
Karol Broda
2025-12-24 11:12:39 +01:00
committed by Karol Broda
parent 933da8bad2
commit 49948de0ed
13 changed files with 1302 additions and 67 deletions

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