// Package server 提供中间件性能基准测试 // // 该文件测试中间件链模块的性能,包括: // - 创建中间件链的开销 // - Process 包装的开销 // - 完整链执行的开销 // // 用于评估中间件链在不同场景下的性能表现 package server import ( "testing" "github.com/valyala/fasthttp" "rua.plus/lolly/internal/middleware" ) // noopMiddleware 是一个空的中间件实现,用于基准测试 // 只记录进入和退出,不做任何实际操作 type noopMiddleware struct { name string } // Name 返回中间件名称 func (m *noopMiddleware) Name() string { return m.name } // Process 包装下一个请求处理器 // 直接调用下一个处理器,不做任何处理 func (m *noopMiddleware) Process(next fasthttp.RequestHandler) fasthttp.RequestHandler { return func(ctx *fasthttp.RequestCtx) { next(ctx) } } // BenchmarkMiddlewareNewChainApply 测试创建中间件链和应用的开销 // // 该基准测试测量: // - 使用 NewChain() 创建链的开销 // - 使用 Apply() 应用中间件链到最终处理器的开销 // // 测试场景:包含 3 个中间件的链 func BenchmarkMiddlewareNewChainApply(b *testing.B) { // 创建 3 个空中间件 mw1 := &noopMiddleware{name: "mw1"} mw2 := &noopMiddleware{name: "mw2"} mw3 := &noopMiddleware{name: "mw3"} // 最终处理器 finalHandler := func(ctx *fasthttp.RequestCtx) { ctx.WriteString("ok") } b.ResetTimer() for b.Loop() { // 创建链并应用 chain := middleware.NewChain(mw1, mw2, mw3) _ = chain.Apply(finalHandler) } } // BenchmarkMiddlewareProcessChain 测试 Process 包装的开销 // // 该基准测试测量单个中间件 Process 方法包装处理器的开销 // 关注单个中间件的包装性能,不涉及链的创建 func BenchmarkMiddlewareProcessChain(b *testing.B) { mw := &noopMiddleware{name: "benchmark"} // 最终处理器 finalHandler := func(ctx *fasthttp.RequestCtx) { ctx.WriteString("ok") } b.ResetTimer() for b.Loop() { // 只测量 Process 包装的开销 _ = mw.Process(finalHandler) } } // BenchmarkMiddlewareChainExecution 测试完整中间件链的执行开销 // // 该基准测试测量: // - 预创建的中间件链的执行性能 // - 多中间件嵌套调用的开销 // - 空 handler 情况下的链遍历成本 // // 测试场景:3 个中间件的完整链执行 func BenchmarkMiddlewareChainExecution(b *testing.B) { // 创建 3 个空中间件 mw1 := &noopMiddleware{name: "mw1"} mw2 := &noopMiddleware{name: "mw2"} mw3 := &noopMiddleware{name: "mw3"} // 创建链并应用 chain := middleware.NewChain(mw1, mw2, mw3) // 最终处理器(空操作) finalHandler := func(ctx *fasthttp.RequestCtx) { // 空 handler,不做任何操作 } handler := chain.Apply(finalHandler) ctx := &fasthttp.RequestCtx{} b.ResetTimer() for b.Loop() { // 执行完整的中间件链 handler(ctx) } } // BenchmarkMiddlewareChainExecutionWithResponse 测试带响应的完整链执行 // // 与 BenchmarkMiddlewareChainExecution 类似,但包含实际的响应写入操作 // 更接近实际使用场景 func BenchmarkMiddlewareChainExecutionWithResponse(b *testing.B) { mw1 := &noopMiddleware{name: "mw1"} mw2 := &noopMiddleware{name: "mw2"} mw3 := &noopMiddleware{name: "mw3"} chain := middleware.NewChain(mw1, mw2, mw3) finalHandler := func(ctx *fasthttp.RequestCtx) { ctx.WriteString("response") } handler := chain.Apply(finalHandler) b.ResetTimer() for b.Loop() { ctx := &fasthttp.RequestCtx{} handler(ctx) } } // BenchmarkMiddlewareEmptyChain 测试空中间件链的性能 // // 作为对照组,测量没有任何中间件时的基础开销 func BenchmarkMiddlewareEmptyChain(b *testing.B) { chain := middleware.NewChain() finalHandler := func(ctx *fasthttp.RequestCtx) { ctx.WriteString("ok") } handler := chain.Apply(finalHandler) ctx := &fasthttp.RequestCtx{} b.ResetTimer() for b.Loop() { handler(ctx) } } // BenchmarkMiddlewareSingleMiddleware 测试单个中间件的开销 // // 测量只有一个中间件时的性能,用于对比多中间件场景 func BenchmarkMiddlewareSingleMiddleware(b *testing.B) { mw := &noopMiddleware{name: "single"} chain := middleware.NewChain(mw) finalHandler := func(ctx *fasthttp.RequestCtx) { ctx.WriteString("ok") } handler := chain.Apply(finalHandler) ctx := &fasthttp.RequestCtx{} b.ResetTimer() for b.Loop() { handler(ctx) } }