Files
v-hono/tests/test_final_optimization_benchmark.v
T

499 lines
13 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: 单路由性能对比(FastRouter vs HybridRouter)
test_single_route_comparison()
// 测试2: 多路由性能对比
test_multiple_routes_comparison()
// 测试3: 大规模路由性能对比
test_large_scale_comparison()
// 测试4: 实际应用场景性能测试
test_real_world_scenario()
// 测试5: 内存使用对比
test_memory_usage_comparison()
println('✅ 最终优化性能基准测试完成')
}
fn test_single_route_comparison() {
println('\n📊 单路由性能对比 (FastRouter vs HybridRouter)...')
route_path := '/api/:version/users/:user_id/posts/:post_id'
test_path := '/api/v1/users/123/posts/456'
// 创建使用FastRouter的应用
mut app_fast := hono.Hono.new()
app_fast.set_fast_router_enabled(true)
app_fast.get(route_path, fn (mut c hono.Context) http.Response {
return c.text('fast router response')
})
// 创建使用HybridRouter的应用
mut app_hybrid := hono.Hono.new()
app_hybrid.set_fast_router_enabled(false)
app_hybrid.get(route_path, fn (mut c hono.Context) http.Response {
return c.text('hybrid router response')
})
iterations := 10000
// 测试FastRouter(第一次匹配)
app_fast.clear_cache()
start_time1 := time.now()
mut fast_matches := 0
for _ in 0 .. iterations {
app_fast.clear_cache()
if _ := app_fast.fast_router.match_route('GET', test_path) {
fast_matches++
}
}
fast_time := time.since(start_time1)
// 测试HybridRouter(第一次匹配)
app_hybrid.clear_cache()
start_time2 := time.now()
mut hybrid_matches := 0
for _ in 0 .. iterations {
app_hybrid.clear_cache()
if _ := app_hybrid.context_hybrid_router.match_route('GET', test_path) {
hybrid_matches++
}
}
hybrid_time := time.since(start_time2)
println(' 第一次匹配性能 (${iterations}次):')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
println(' FastRouter: ${fast_time} (平均 ${avg_fast:.3f}μs)')
}
if hybrid_matches > 0 {
avg_hybrid := f64(hybrid_time.microseconds()) / f64(hybrid_matches)
println(' HybridRouter: ${hybrid_time} (平均 ${avg_hybrid:.3f}μs)')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
if avg_hybrid > avg_fast {
improvement := avg_hybrid / avg_fast
println(' 🚀 FastRouter提升: ${improvement:.2f}x')
}
}
}
// 测试缓存匹配性能
start_time3 := time.now()
mut fast_cache_matches := 0
for _ in 0 .. iterations {
if _ := app_fast.fast_router.match_route('GET', test_path) {
fast_cache_matches++
}
}
fast_cache_time := time.since(start_time3)
start_time4 := time.now()
mut hybrid_cache_matches := 0
for _ in 0 .. iterations {
if _ := app_hybrid.context_hybrid_router.match_route('GET', test_path) {
hybrid_cache_matches++
}
}
hybrid_cache_time := time.since(start_time4)
println('\n 缓存匹配性能 (${iterations}次):')
if fast_cache_matches > 0 {
avg_fast_cache := f64(fast_cache_time.microseconds()) / f64(fast_cache_matches)
println(' FastRouter: ${fast_cache_time} (平均 ${avg_fast_cache:.3f}μs)')
}
if hybrid_cache_matches > 0 {
avg_hybrid_cache := f64(hybrid_cache_time.microseconds()) / f64(hybrid_cache_matches)
println(' HybridRouter: ${hybrid_cache_time} (平均 ${avg_hybrid_cache:.3f}μs)')
if fast_cache_matches > 0 {
avg_fast_cache := f64(fast_cache_time.microseconds()) / f64(fast_cache_matches)
if avg_hybrid_cache > avg_fast_cache {
improvement := avg_hybrid_cache / avg_fast_cache
println(' 🚀 FastRouter提升: ${improvement:.2f}x')
}
}
}
}
fn test_multiple_routes_comparison() {
println('\n📊 多路由性能对比...')
// 定义测试路由
test_routes := [
{
'route': '/users/:id'
'path': '/users/123'
},
{
'route': '/users/:id/posts/:post_id'
'path': '/users/123/posts/456'
},
{
'route': '/api/:version/users/:user_id/posts/:post_id'
'path': '/api/v1/users/123/posts/456'
},
{
'route': '/shop/:category/:subcategory/products/:product_id'
'path': '/shop/electronics/phones/products/999'
},
{
'route': '/files/:year/:month/:day/:filename'
'path': '/files/2023/12/26/document.pdf'
}
]
// 创建FastRouter应用
mut app_fast := hono.Hono.new()
app_fast.set_fast_router_enabled(true)
for route_info in test_routes {
app_fast.get(route_info['route'], fn (mut c hono.Context) http.Response {
return c.text('fast response')
})
}
// 创建HybridRouter应用
mut app_hybrid := hono.Hono.new()
app_hybrid.set_fast_router_enabled(false)
for route_info in test_routes {
app_hybrid.get(route_info['route'], fn (mut c hono.Context) http.Response {
return c.text('hybrid response')
})
}
iterations := 5000
// 测试FastRouter
app_fast.clear_cache()
start_time1 := time.now()
mut fast_matches := 0
for _ in 0 .. iterations {
for route_info in test_routes {
if _ := app_fast.fast_router.match_route('GET', route_info['path']) {
fast_matches++
}
}
}
fast_time := time.since(start_time1)
// 测试HybridRouter
app_hybrid.clear_cache()
start_time2 := time.now()
mut hybrid_matches := 0
for _ in 0 .. iterations {
for route_info in test_routes {
if _ := app_hybrid.context_hybrid_router.match_route('GET', route_info['path']) {
hybrid_matches++
}
}
}
hybrid_time := time.since(start_time2)
println(' 多路由匹配性能 (${iterations}轮 × ${test_routes.len}路由):')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
println(' FastRouter: ${fast_time} (平均 ${avg_fast:.3f}μs)')
}
if hybrid_matches > 0 {
avg_hybrid := f64(hybrid_time.microseconds()) / f64(hybrid_matches)
println(' HybridRouter: ${hybrid_time} (平均 ${avg_hybrid:.3f}μs)')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
if avg_hybrid > avg_fast {
improvement := avg_hybrid / avg_fast
println(' 🚀 FastRouter提升: ${improvement:.2f}x')
}
}
}
// 显示统计信息
println('\n 路由统计:')
fast_static, fast_dynamic, fast_cache, _ := app_fast.get_router_stats()
hybrid_static, hybrid_dynamic, hybrid_cache, _ := app_hybrid.get_router_stats()
println(' FastRouter - 静态: ${fast_static}, 动态: ${fast_dynamic}, 缓存: ${fast_cache}')
println(' HybridRouter - 静态: ${hybrid_static}, 动态: ${hybrid_dynamic}, 缓存: ${hybrid_cache}')
}
fn test_large_scale_comparison() {
println('\n📊 大规模路由性能对比...')
// 创建大量路由
mut app_fast := hono.Hono.new()
app_fast.set_fast_router_enabled(true)
mut app_hybrid := hono.Hono.new()
app_hybrid.set_fast_router_enabled(false)
route_count := 100
for i in 0 .. route_count {
route_path := '/api/v${i}/resources/:id/items/:item_id'
app_fast.get(route_path, fn (mut c hono.Context) http.Response {
return c.text('fast response')
})
app_hybrid.get(route_path, fn (mut c hono.Context) http.Response {
return c.text('hybrid response')
})
}
// 测试路径
test_paths := [
'/api/v1/resources/123/items/456',
'/api/v25/resources/789/items/101',
'/api/v50/resources/111/items/222',
'/api/v75/resources/333/items/444',
'/api/v99/resources/555/items/666'
]
iterations := 2000
// 测试FastRouter
start_time1 := time.now()
mut fast_matches := 0
for _ in 0 .. iterations {
for path in test_paths {
if _ := app_fast.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 .. iterations {
for path in test_paths {
if _ := app_hybrid.context_hybrid_router.match_route('GET', path) {
hybrid_matches++
}
}
}
hybrid_time := time.since(start_time2)
println(' 大规模路由匹配 (${route_count}个路由, ${iterations}轮 × ${test_paths.len}路径):')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
println(' FastRouter: ${fast_time} (平均 ${avg_fast:.3f}μs)')
}
if hybrid_matches > 0 {
avg_hybrid := f64(hybrid_time.microseconds()) / f64(hybrid_matches)
println(' HybridRouter: ${hybrid_time} (平均 ${avg_hybrid:.3f}μs)')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
if avg_hybrid > avg_fast {
improvement := avg_hybrid / avg_fast
println(' 🚀 FastRouter提升: ${improvement:.2f}x')
}
}
}
}
fn test_real_world_scenario() {
println('\n📊 实际应用场景性能测试...')
// 模拟真实的Web应用路由
mut app_fast := hono.Hono.new()
app_fast.set_fast_router_enabled(true)
mut app_hybrid := hono.Hono.new()
app_hybrid.set_fast_router_enabled(false)
// 添加常见的Web应用路由
real_routes := [
// 用户管理
'/users',
'/users/:id',
'/users/:id/profile',
'/users/:id/settings',
// API路由
'/api/v1/users',
'/api/v1/users/:id',
'/api/v1/users/:id/posts',
'/api/v1/users/:id/posts/:post_id',
// 文件管理
'/files/:category/:filename',
'/files/:year/:month/:day/:filename',
// 商店功能
'/shop/categories/:category',
'/shop/categories/:category/products',
'/shop/categories/:category/products/:product_id',
// 管理后台
'/admin/dashboard',
'/admin/users/:id',
'/admin/reports/:type/:date'
]
for route in real_routes {
app_fast.get(route, fn (mut c hono.Context) http.Response {
return c.text('response')
})
app_hybrid.get(route, fn (mut c hono.Context) http.Response {
return c.text('response')
})
}
// 模拟真实的访问模式(某些路由访问频率更高)
test_scenarios := [
// 高频访问
{
'path': '/api/v1/users/123'
'weight': '30'
},
{
'path': '/users/456/profile'
'weight': '25'
},
// 中频访问
{
'path': '/shop/categories/electronics/products/999'
'weight': '15'
},
{
'path': '/files/2023/12/26/document.pdf'
'weight': '10'
},
// 低频访问
{
'path': '/admin/users/789'
'weight': '5'
},
{
'path': '/admin/reports/sales/2023-12-26'
'weight': '3'
}
]
// 构建加权测试路径
mut weighted_paths := []string{}
for scenario in test_scenarios {
weight := scenario['weight'].int()
for _ in 0 .. weight {
weighted_paths << scenario['path']
}
}
iterations := 1000
// 测试FastRouter
start_time1 := time.now()
mut fast_matches := 0
for _ in 0 .. iterations {
for path in weighted_paths {
if _ := app_fast.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 .. iterations {
for path in weighted_paths {
if _ := app_hybrid.context_hybrid_router.match_route('GET', path) {
hybrid_matches++
}
}
}
hybrid_time := time.since(start_time2)
println(' 真实应用场景 (${real_routes.len}个路由, ${iterations}轮 × ${weighted_paths.len}加权请求):')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
println(' FastRouter: ${fast_time} (平均 ${avg_fast:.3f}μs)')
}
if hybrid_matches > 0 {
avg_hybrid := f64(hybrid_time.microseconds()) / f64(hybrid_matches)
println(' HybridRouter: ${hybrid_time} (平均 ${avg_hybrid:.3f}μs)')
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
if avg_hybrid > avg_fast {
improvement := avg_hybrid / avg_fast
println(' 🚀 FastRouter提升: ${improvement:.2f}x')
}
}
}
}
fn test_memory_usage_comparison() {
println('\n📊 内存使用对比...')
// 创建大量路由来测试内存使用
mut app_fast := hono.Hono.new()
app_fast.set_fast_router_enabled(true)
mut app_hybrid := hono.Hono.new()
app_hybrid.set_fast_router_enabled(false)
route_count := 1000
println(' 创建 ${route_count} 个路由...')
for i in 0 .. route_count {
route_path := '/api/v${i % 10}/category${i % 20}/resource${i % 50}/:id/item/:item_id'
app_fast.get(route_path, fn (mut c hono.Context) http.Response {
return c.text('response')
})
app_hybrid.get(route_path, fn (mut c hono.Context) http.Response {
return c.text('response')
})
}
// 显示路由统计
fast_static, fast_dynamic, fast_cache, _ := app_fast.get_router_stats()
hybrid_static, hybrid_dynamic, hybrid_cache, _ := app_hybrid.get_router_stats()
println(' 路由统计:')
println(' FastRouter - 静态: ${fast_static}, 动态: ${fast_dynamic}, 缓存: ${fast_cache}')
println(' HybridRouter - 静态: ${hybrid_static}, 动态: ${hybrid_dynamic}, 缓存: ${hybrid_cache}')
// 测试缓存增长
test_paths := [
'/api/v1/category5/resource10/123/item/456',
'/api/v2/category8/resource25/789/item/101',
'/api/v3/category12/resource30/111/item/222'
]
println('\n 测试缓存增长...')
for i, path in test_paths {
app_fast.fast_router.match_route('GET', path)
app_hybrid.context_hybrid_router.match_route('GET', path)
_, _, fast_c, _ := app_fast.get_router_stats()
_, _, hybrid_c, _ := app_hybrid.get_router_stats()
println(' 第${i+1}次匹配后:')
println(' FastRouter缓存: ${fast_c}')
println(' HybridRouter缓存: ${hybrid_c}')
}
}