test(proxy): 缓存键零分配验证测试
验证 buildCacheKeyHashValue 零分配优化: - ZeroAlloc: 0 allocs/op (已达标) - WithAlloc: 1 allocs/op (对比基准) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
41288a560f
commit
0d987bb060
110
internal/proxy/cache_key_allocation_test.go
Normal file
110
internal/proxy/cache_key_allocation_test.go
Normal file
@ -0,0 +1,110 @@
|
||||
// Package proxy 提供代理缓存键零分配验证测试。
|
||||
//
|
||||
// 该文件验证 buildCacheKeyHashValue 的零分配优化效果。
|
||||
//
|
||||
// 测试场景:
|
||||
// - buildCacheKeyHashValue: 直接哈希,目标 0 allocs/op
|
||||
// - buildCacheKeyHash: 字符串构建,对比基准
|
||||
//
|
||||
// 作者:xfy
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/valyala/fasthttp"
|
||||
"rua.plus/lolly/internal/config"
|
||||
"rua.plus/lolly/internal/loadbalance"
|
||||
)
|
||||
|
||||
// BenchmarkCacheKeyHashValue_ZeroAlloc 验证零分配路径。
|
||||
//
|
||||
// buildCacheKeyHashValue 直接写入哈希,不分配字符串。
|
||||
func BenchmarkCacheKeyHashValue_ZeroAlloc(b *testing.B) {
|
||||
p, err := NewProxy(&config.ProxyConfig{
|
||||
Path: "/api",
|
||||
LoadBalance: "round_robin",
|
||||
Timeout: config.ProxyTimeout{
|
||||
Connect: 5 * 1e9,
|
||||
Read: 30 * 1e9,
|
||||
Write: 30 * 1e9,
|
||||
},
|
||||
}, []*loadbalance.Target{{URL: "http://localhost:8080"}}, nil, nil)
|
||||
if err != nil {
|
||||
b.Fatalf("NewProxy() error: %v", err)
|
||||
}
|
||||
|
||||
ctx := &fasthttp.RequestCtx{}
|
||||
ctx.Request.Header.SetMethod(fasthttp.MethodGet)
|
||||
ctx.Request.SetRequestURI("/api/test?query=value&foo=bar")
|
||||
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
|
||||
for b.Loop() {
|
||||
hash := p.buildCacheKeyHashValue(ctx)
|
||||
_ = hash
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkCacheKeyHash_WithAlloc 对比带分配的字符串构建路径。
|
||||
//
|
||||
// buildCacheKeyHash 分配字符串用于 origKey 返回值。
|
||||
func BenchmarkCacheKeyHash_WithAlloc(b *testing.B) {
|
||||
p, err := NewProxy(&config.ProxyConfig{
|
||||
Path: "/api",
|
||||
LoadBalance: "round_robin",
|
||||
Timeout: config.ProxyTimeout{
|
||||
Connect: 5 * 1e9,
|
||||
Read: 30 * 1e9,
|
||||
Write: 30 * 1e9,
|
||||
},
|
||||
}, []*loadbalance.Target{{URL: "http://localhost:8080"}}, nil, nil)
|
||||
if err != nil {
|
||||
b.Fatalf("NewProxy() error: %v", err)
|
||||
}
|
||||
|
||||
ctx := &fasthttp.RequestCtx{}
|
||||
ctx.Request.Header.SetMethod(fasthttp.MethodGet)
|
||||
ctx.Request.SetRequestURI("/api/test?query=value&foo=bar")
|
||||
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
|
||||
for b.Loop() {
|
||||
hash, key := p.buildCacheKeyHash(ctx)
|
||||
_ = hash
|
||||
_ = key
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkCacheKeyHash_Compare 并行对比两种方法。
|
||||
func BenchmarkCacheKeyHash_Compare(b *testing.B) {
|
||||
p, err := NewProxy(&config.ProxyConfig{
|
||||
Path: "/api",
|
||||
LoadBalance: "round_robin",
|
||||
}, []*loadbalance.Target{{URL: "http://localhost:8080"}}, nil, nil)
|
||||
if err != nil {
|
||||
b.Fatalf("NewProxy() error: %v", err)
|
||||
}
|
||||
|
||||
ctx := &fasthttp.RequestCtx{}
|
||||
ctx.Request.Header.SetMethod(fasthttp.MethodGet)
|
||||
ctx.Request.SetRequestURI("/api/data?id=123&sort=desc")
|
||||
|
||||
b.Run("ZeroAlloc", func(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for b.Loop() {
|
||||
_ = p.buildCacheKeyHashValue(ctx)
|
||||
}
|
||||
})
|
||||
|
||||
b.Run("WithAlloc", func(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for b.Loop() {
|
||||
_, _ = p.buildCacheKeyHash(ctx)
|
||||
}
|
||||
})
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user