Apply modern Go patterns across the codebase:
- Replace `interface{}` with `any` (Go 1.18+)
- Use `for range n` instead of `for i := 0; i < n; i++` (Go 1.22+)
- Replace `sort.Slice` with `slices.Sort` from slices package
- Simplify sync.WaitGroup patterns with errgroup where appropriate
- Add Makefile targets for modernize analyzer
Total: 84 files updated, net reduction of 79 lines
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
143 lines
3.1 KiB
Go
143 lines
3.1 KiB
Go
// Package security 提供滑动窗口限流器的基准测试。
|
||
//
|
||
// 该文件测试近似模式和精确模式的滑动窗口限流性能。
|
||
//
|
||
// 作者:xfy
|
||
package security
|
||
|
||
import (
|
||
"testing"
|
||
"time"
|
||
)
|
||
|
||
// BenchmarkSlidingWindowAllow 测试近似模式滑动窗口 Allow 性能。
|
||
func BenchmarkSlidingWindowAllow(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 10000, false)
|
||
|
||
b.ResetTimer()
|
||
for b.Loop() {
|
||
sw.Allow("192.168.1.100")
|
||
}
|
||
}
|
||
|
||
// BenchmarkSlidingWindowAllowPrecise 测试精确模式滑动窗口 Allow 性能。
|
||
func BenchmarkSlidingWindowAllowPrecise(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 10000, true)
|
||
|
||
b.ResetTimer()
|
||
for b.Loop() {
|
||
sw.Allow("192.168.1.100")
|
||
}
|
||
}
|
||
|
||
// BenchmarkSlidingWindowAllowParallel 测试近似模式并发 Allow 性能。
|
||
func BenchmarkSlidingWindowAllowParallel(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 100000, false)
|
||
|
||
clients := make([]string, 10)
|
||
for i := range clients {
|
||
clients[i] = "192.168.1." + string(rune('0'+i))
|
||
}
|
||
|
||
b.ResetTimer()
|
||
b.RunParallel(func(pb *testing.PB) {
|
||
i := 0
|
||
for pb.Next() {
|
||
sw.Allow(clients[i%10])
|
||
i++
|
||
}
|
||
})
|
||
}
|
||
|
||
// BenchmarkSlidingWindowAllowPreciseParallel 测试精确模式并发 Allow 性能。
|
||
func BenchmarkSlidingWindowAllowPreciseParallel(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 100000, true)
|
||
|
||
clients := make([]string, 10)
|
||
for i := range clients {
|
||
clients[i] = "192.168.1." + string(rune('0'+i))
|
||
}
|
||
|
||
b.ResetTimer()
|
||
b.RunParallel(func(pb *testing.PB) {
|
||
i := 0
|
||
for pb.Next() {
|
||
sw.Allow(clients[i%10])
|
||
i++
|
||
}
|
||
})
|
||
}
|
||
|
||
// BenchmarkSlidingWindowCleanup 测试滑动窗口清理性能。
|
||
func BenchmarkSlidingWindowCleanup(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 1000, false)
|
||
|
||
// 预创建 100 个键
|
||
for i := range 100 {
|
||
sw.Allow("192.168.0." + string(rune(i)))
|
||
}
|
||
|
||
b.ResetTimer()
|
||
for b.Loop() {
|
||
sw.Cleanup(time.Hour)
|
||
}
|
||
}
|
||
|
||
// BenchmarkSlidingWindowGetCount 测试获取计数性能。
|
||
func BenchmarkSlidingWindowGetCount(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 10000, false)
|
||
key := "192.168.1.100"
|
||
|
||
// 预先添加一些请求
|
||
for range 100 {
|
||
sw.Allow(key)
|
||
}
|
||
|
||
b.ResetTimer()
|
||
for b.Loop() {
|
||
sw.GetCount(key)
|
||
}
|
||
}
|
||
|
||
// BenchmarkSlidingWindowReset 测试重置性能。
|
||
func BenchmarkSlidingWindowReset(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 10000, false)
|
||
key := "192.168.1.100"
|
||
|
||
b.ResetTimer()
|
||
for b.Loop() {
|
||
sw.Allow(key)
|
||
sw.Reset(key)
|
||
}
|
||
}
|
||
|
||
// BenchmarkSlidingWindowMultiKey 测试多键场景性能。
|
||
func BenchmarkSlidingWindowMultiKey(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 10000, false)
|
||
|
||
keys := make([]string, 100)
|
||
for i := range keys {
|
||
keys[i] = "192.168.0." + string(rune(i))
|
||
}
|
||
|
||
b.ResetTimer()
|
||
for i := 0; b.Loop(); i++ {
|
||
sw.Allow(keys[i%100])
|
||
}
|
||
}
|
||
|
||
// BenchmarkSlidingWindowStats 测试获取统计信息性能。
|
||
func BenchmarkSlidingWindowStats(b *testing.B) {
|
||
sw := NewSlidingWindowLimiter(time.Second, 10000, false)
|
||
|
||
// 预创建一些键
|
||
for i := range 50 {
|
||
sw.Allow("192.168.0." + string(rune(i)))
|
||
}
|
||
|
||
b.ResetTimer()
|
||
for b.Loop() {
|
||
sw.GetStats()
|
||
}
|
||
}
|