Files
v-hono/tests/test_router_million_stable.v
meiseayoung 3b8d21dd0d fix: update import path to VPM package name (meiseayoung.hono)
- Change all `import hono` to `import meiseayoung.hono` in code and docs
- Ensure compatibility with VPM installation via `v install meiseayoung.hono`
2026-01-02 22:05:12 +08:00

245 lines
6.4 KiB
V

import meiseayoung.hono
import time
import net.http
fn main() {
println('=== 路由性能百万级基准测试 ===')
// 测试1: 百万次路由匹配 - 小规模路由
test_million_matches_small_scale()
// 测试2: 百万次路由匹配 - 中等规模路由
test_million_matches_medium_scale()
// 测试3: 百万次复杂路由匹配
test_million_complex_routes()
println('\n🎯 百万级基准测试完成')
}
fn test_million_matches_small_scale() {
println('\n📊 百万次路由匹配 - 小规模 (10个动态路由)...')
mut router := hono.ContextHybridRouter.new()
// 添加10个动态路由
dynamic_routes := [
'/users/:id',
'/posts/:post_id/comments/:comment_id',
'/api/v1/users/:user_id/posts/:post_id',
'/files/:category/:filename',
'/search/:query',
'/admin/users/:id/settings',
'/api/v2/projects/:project_id/tasks/:task_id',
'/shop/products/:id/reviews/:review_id',
'/blog/:year/:month/:slug',
'/docs/:section/:page'
]
for route in dynamic_routes {
handler := hono.ContextHandler{
path: route
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
router.add_route('GET', handler, '')
}
// 测试路径
test_paths := [
'/users/123',
'/posts/456/comments/789',
'/api/v1/users/101/posts/202',
'/files/images/photo.jpg',
'/search/test-query',
'/admin/users/555/settings',
'/api/v2/projects/777/tasks/888',
'/shop/products/999/reviews/111',
'/blog/2023/12/hello-world',
'/docs/api/authentication'
]
iterations := 100000 // 100万次 = 100000 * 10路径
total_matches := iterations * test_paths.len
println(' 准备进行 ${total_matches} 次路由匹配测试...')
start_time := time.now()
mut matches := 0
for i in 0 .. iterations {
for path in test_paths {
if _ := router.match_route('GET', path) {
matches++
}
}
if i % 10000 == 0 {
print('.')
}
}
total_time := time.since(start_time)
println('')
avg_time := f64(total_time.microseconds()) / f64(matches)
qps := f64(matches) / (f64(total_time.milliseconds()) / 1000.0)
println(' 📊 小规模路由性能结果:')
println(' 总匹配次数: ${matches}')
println(' 总耗时: ${total_time}')
println(' 平均每次匹配: ${avg_time:.2f}μs')
println(' 吞吐量: ${qps:.0f} 请求/秒')
if avg_time < 15.0 {
println(' ✅ 性能优秀 (< 15μs)')
} else if avg_time < 50.0 {
println(' ✅ 性能良好 (< 50μs)')
} else {
println(' ⚠️ 性能需要优化 (>= 50μs)')
}
}
fn test_million_matches_medium_scale() {
println('\n📊 百万次路由匹配 - 中等规模 (50个动态路由)...')
mut router := hono.ContextHybridRouter.new()
// 添加50个动态路由
for i in 0 .. 50 {
route := '/api/v${i}/resources/: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, '')
}
// 测试路径
test_paths := [
'/api/v1/resources/123/items/456',
'/api/v10/resources/789/items/101',
'/api/v25/resources/111/items/222',
'/api/v35/resources/333/items/444',
'/api/v49/resources/555/items/666'
]
iterations := 200000 // 100万次 = 200000 * 5路径
total_matches := iterations * test_paths.len
println(' 准备进行 ${total_matches} 次路由匹配测试...')
start_time := time.now()
mut matches := 0
for i in 0 .. iterations {
for path in test_paths {
if _ := router.match_route('GET', path) {
matches++
}
}
if i % 20000 == 0 {
print('.')
}
}
total_time := time.since(start_time)
println('')
avg_time := f64(total_time.microseconds()) / f64(matches)
qps := f64(matches) / (f64(total_time.milliseconds()) / 1000.0)
println(' 📊 中等规模路由性能结果:')
println(' 总匹配次数: ${matches}')
println(' 总耗时: ${total_time}')
println(' 平均每次匹配: ${avg_time:.2f}μs')
println(' 吞吐量: ${qps:.0f} 请求/秒')
if avg_time < 15.0 {
println(' ✅ 性能优秀 (< 15μs)')
} else if avg_time < 50.0 {
println(' ✅ 性能良好 (< 50μs)')
} else {
println(' ⚠️ 性能需要优化 (>= 50μs)')
}
}
fn test_million_complex_routes() {
println('\n📊 百万次复杂路由匹配测试...')
mut router := hono.ContextHybridRouter.new()
// 添加复杂的动态路由
complex_routes := [
'/api/:version/users/:user_id/posts/:post_id/comments/:comment_id',
'/shop/:category/:subcategory/products/:product_id/reviews/:review_id',
'/admin/:module/:action/:resource_type/:resource_id',
'/files/:year/:month/:day/:category/:filename',
'/docs/:language/:version/:section/:subsection/:page'
]
for route in complex_routes {
handler := hono.ContextHandler{
path: route
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
router.add_route('GET', handler, '')
}
// 复杂测试路径
test_paths := [
'/api/v1/users/123/posts/456/comments/789',
'/shop/electronics/phones/products/999/reviews/111',
'/admin/users/edit/profile/555',
'/files/2023/12/26/images/photo.jpg',
'/docs/en/v2/api/authentication/oauth'
]
iterations := 200000 // 100万次 = 200000 * 5路径
total_matches := iterations * test_paths.len
println(' 准备进行 ${total_matches} 次复杂路由匹配测试...')
start_time := time.now()
mut matches := 0
for i in 0 .. iterations {
for path in test_paths {
if _ := router.match_route('GET', path) {
matches++
}
}
if i % 20000 == 0 {
print('.')
}
}
total_time := time.since(start_time)
println('')
avg_time := f64(total_time.microseconds()) / f64(matches)
qps := f64(matches) / (f64(total_time.milliseconds()) / 1000.0)
println(' 📊 复杂路由性能结果:')
println(' 总匹配次数: ${matches}')
println(' 总耗时: ${total_time}')
println(' 平均每次匹配: ${avg_time:.2f}μs')
println(' 吞吐量: ${qps:.0f} 请求/秒')
if avg_time < 15.0 {
println(' ✅ 性能优秀 (< 15μs)')
} else if avg_time < 50.0 {
println(' ✅ 性能良好 (< 50μs)')
} else {
println(' ⚠️ 性能需要优化 (>= 50μs)')
}
// 显示缓存统计
println('\n 📈 缓存统计信息:')
cache_size, cache_capacity := router.get_cache_stats()
regex_total, regex_compiled := router.get_regex_cache_stats()
println(' 路由缓存: ${cache_size}/${cache_capacity}')
println(' 正则缓存: ${regex_compiled}/${regex_total} 已编译')
router.analyze_router_performance()
}