Files
v-hono/test_router_optimization.v
T

244 lines
6.1 KiB
V
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import hono
import time
import net.http
fn main() {
println('=== 路由匹配性能优化测试 ===')
// 测试1: 正则表达式编译缓存效果
test_regex_compilation_cache()
// 测试2: 路由匹配性能对比
test_route_matching_performance()
// 测试3: 缓存预热效果
test_cache_warmup_effect()
// 测试4: 批量路由添加性能
test_batch_route_addition()
println('\n✅ 所有路由优化测试完成')
}
fn test_regex_compilation_cache() {
println('\n📊 测试正则表达式编译缓存效果...')
mut fast_router := hono.FastRouter.new()
// 添加一些动态路由
test_routes := [
'/users/:id',
'/posts/:post_id/comments/:comment_id',
'/api/v1/users/:user_id/posts/:post_id',
'/files/:category/:filename',
'/search/*query'
]
// 测试路由编译时间
start_time := time.now()
for route in test_routes {
handler := hono.ContextHandler{
path: route
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
fast_router.add_route('GET', handler, '') or {
println(' ⚠️ 添加路由失败: ${route}')
}
}
compilation_time := time.since(start_time)
static_count, dynamic_count, cache_count := fast_router.get_stats()
println(' 路由编译时间: ${compilation_time}')
println(' 静态路由: ${static_count}, 动态路由: ${dynamic_count}, 缓存: ${cache_count}')
// 测试匹配性能(使用缓存的编译结果)
test_paths := [
'/users/123',
'/posts/456/comments/789',
'/api/v1/users/101/posts/202',
'/files/images/photo.jpg',
'/search/test-query'
]
start_time2 := time.now()
mut matches := 0
for _ in 0 .. 1000 {
for path in test_paths {
if _ := fast_router.match_route('GET', path) {
matches++
}
}
}
matching_time := time.since(start_time2)
println(' 匹配测试 (1000次 × ${test_paths.len}路径): ${matching_time}')
println(' 成功匹配: ${matches}')
if matching_time.microseconds() > 0 {
println(' 平均每次匹配: ${matching_time.microseconds() / (1000 * test_paths.len)}μs')
}
}
fn test_route_matching_performance() {
println('\n📊 测试路由匹配性能对比...')
// 创建 FastRouter
mut fast_router := hono.FastRouter.new()
// 创建 HybridRouter(用于对比)
mut hybrid_router := hono.ContextHybridRouter.new()
// 添加相同的路由到两个路由器
mut test_routes := []string{}
for i in 0 .. 100 {
route := '/api/v${i}/users/:id/posts/:post_id'
test_routes << route
handler := hono.ContextHandler{
path: route
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
fast_router.add_route('GET', handler, '') or {}
hybrid_router.add_route('GET', handler, '')
}
// 测试路径
test_paths := [
'/api/v1/users/123/posts/456',
'/api/v50/users/789/posts/101',
'/api/v99/users/111/posts/222'
]
// 测试 FastRouter 性能
start_time1 := time.now()
mut fast_matches := 0
for _ in 0 .. 50000 {
for path in test_paths {
if _ := fast_router.match_route('GET', path) {
fast_matches++
}
}
}
fast_time := time.since(start_time1)
// 测试 HybridRouter 性能
start_time2 := time.now()
mut hybrid_matches := 0
for _ in 0 .. 50000 {
for path in test_paths {
if _ := hybrid_router.match_route('GET', path) {
hybrid_matches++
}
}
}
hybrid_time := time.since(start_time2)
println(' FastRouter (50000次 × ${test_paths.len}路径): ${fast_time}')
println(' HybridRouter (50000次 × ${test_paths.len}路径): ${hybrid_time}')
if hybrid_time.milliseconds() > 0 && fast_time.milliseconds() > 0 {
improvement := f64(hybrid_time.milliseconds()) / f64(fast_time.milliseconds())
println(' 性能对比: ${improvement:.2f}x')
}
println(' FastRouter 匹配: ${fast_matches}')
println(' HybridRouter 匹配: ${hybrid_matches}')
// 显示性能分析
fast_router.analyze_performance()
}
fn test_cache_warmup_effect() {
println('\n📊 测试缓存预热效果...')
mut router := hono.FastRouter.new()
// 添加路由
for _ in 0 .. 50 {
route := '/api/users/:id/items/:item_id'
handler := hono.ContextHandler{
path: route
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
router.add_route('GET', handler, '') or {}
}
common_paths := [
'/api/users/123/items/456',
'/api/users/789/items/101',
'/api/users/111/items/222'
]
// 清除缓存,测试预热前的性能
router.clear_cache()
start_time1 := time.now()
for _ in 0 .. 10000 {
for path in common_paths {
_ := router.match_route('GET', path) or { continue }
}
}
before_warmup := time.since(start_time1)
// 清除缓存并预热
router.clear_cache()
router.warmup_cache(common_paths, 'GET')
// 测试预热后的性能
start_time2 := time.now()
for _ in 0 .. 10000 {
for path in common_paths {
_ := router.match_route('GET', path) or { continue }
}
}
after_warmup := time.since(start_time2)
println(' 预热前 (10000次 × ${common_paths.len}路径): ${before_warmup}')
println(' 预热后 (10000次 × ${common_paths.len}路径): ${after_warmup}')
if before_warmup.milliseconds() > 0 && after_warmup.milliseconds() > 0 {
improvement := f64(before_warmup.milliseconds()) / f64(after_warmup.milliseconds())
println(' 预热效果: ${improvement:.2f}x')
}
router.analyze_performance()
}
fn test_batch_route_addition() {
println('\n📊 测试批量路由添加性能...')
mut router := hono.FastRouter.new()
// 测试批量添加性能
start_time := time.now()
for i in 0 .. 1000 {
handler := hono.ContextHandler{
path: '/api/v1/resource${i}/:id'
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
router.add_route('GET', handler, '') or {}
}
batch_time := time.since(start_time)
static_count, dynamic_count, cache_count := router.get_stats()
println(' 批量添加1000个路由: ${batch_time}')
println(' 平均每个路由: ${batch_time.microseconds() / 1000}μs')
println(' 路由统计: 静态=${static_count}, 动态=${dynamic_count}, 缓存=${cache_count}')
// 测试健康检查
if router.is_healthy() {
println(' ✅ 路由器健康检查通过')
} else {
println(' ❌ 路由器健康检查失败')
}
}