Files
v-hono/test_fast_router_benchmark.v
T

407 lines
10 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_single_route_performance()
// 测试2: 多路由性能对比
test_multiple_routes_performance()
// 测试3: 大规模路由性能对比
test_large_scale_performance()
// 测试4: 缓存效果对比
test_cache_effectiveness()
println('✅ 快速路由器基准测试完成')
}
fn test_single_route_performance() {
println('\n📊 单路由性能对比...')
route_path := '/api/:version/users/:user_id/posts/:post_id'
test_path := '/api/v1/users/123/posts/456'
// 创建原始路由器
mut old_router := hono.ContextHybridRouter.new()
old_handler := hono.ContextHandler{
path: route_path
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
old_router.add_route('GET', old_handler, '')
// 创建快速路由器
mut fast_router := hono.FastRouter.new()
fast_handler := hono.ContextHandler{
path: route_path
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
fast_router.add_route('GET', fast_handler, '') or {
println(' ❌ 快速路由器添加路由失败: ${err}')
return
}
iterations := 10000
// 测试原始路由器(第一次匹配)
old_router.clear_cache()
old_router.clear_regex_cache()
start_time1 := time.now()
mut old_first_matches := 0
for _ in 0 .. iterations {
old_router.clear_cache()
old_router.clear_regex_cache()
if _ := old_router.match_route('GET', test_path) {
old_first_matches++
}
}
old_first_time := time.since(start_time1)
// 测试快速路由器(第一次匹配)
fast_router.clear_cache()
start_time2 := time.now()
mut fast_first_matches := 0
for _ in 0 .. iterations {
fast_router.clear_cache()
if _ := fast_router.match_route('GET', test_path) {
fast_first_matches++
}
}
fast_first_time := time.since(start_time2)
println(' 第一次匹配性能 (${iterations}次):')
if old_first_matches > 0 {
avg_old_first := f64(old_first_time.microseconds()) / f64(old_first_matches)
println(' 原始路由器: ${old_first_time} (平均 ${avg_old_first:.3f}μs)')
}
if fast_first_matches > 0 {
avg_fast_first := f64(fast_first_time.microseconds()) / f64(fast_first_matches)
println(' 快速路由器: ${fast_first_time} (平均 ${avg_fast_first:.3f}μs)')
if old_first_matches > 0 {
avg_old_first := f64(old_first_time.microseconds()) / f64(old_first_matches)
if avg_old_first > avg_fast_first {
improvement := avg_old_first / avg_fast_first
println(' 🚀 快速路由器提升: ${improvement:.2f}x')
}
}
}
// 测试缓存匹配性能
start_time3 := time.now()
mut old_cache_matches := 0
for _ in 0 .. iterations {
if _ := old_router.match_route('GET', test_path) {
old_cache_matches++
}
}
old_cache_time := time.since(start_time3)
start_time4 := time.now()
mut fast_cache_matches := 0
for _ in 0 .. iterations {
if _ := fast_router.match_route('GET', test_path) {
fast_cache_matches++
}
}
fast_cache_time := time.since(start_time4)
println('\n 缓存匹配性能 (${iterations}次):')
if old_cache_matches > 0 {
avg_old_cache := f64(old_cache_time.microseconds()) / f64(old_cache_matches)
println(' 原始路由器: ${old_cache_time} (平均 ${avg_old_cache:.3f}μs)')
}
if fast_cache_matches > 0 {
avg_fast_cache := f64(fast_cache_time.microseconds()) / f64(fast_cache_matches)
println(' 快速路由器: ${fast_cache_time} (平均 ${avg_fast_cache:.3f}μs)')
if old_cache_matches > 0 {
avg_old_cache := f64(old_cache_time.microseconds()) / f64(old_cache_matches)
if avg_old_cache > avg_fast_cache {
improvement := avg_old_cache / avg_fast_cache
println(' 🚀 快速路由器提升: ${improvement:.2f}x')
}
}
}
}
fn test_multiple_routes_performance() {
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'
}
]
// 创建原始路由器
mut old_router := hono.ContextHybridRouter.new()
for route_info in test_routes {
handler := hono.ContextHandler{
path: route_info['route']
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
old_router.add_route('GET', handler, '')
}
// 创建快速路由器
mut fast_router := hono.FastRouter.new()
for route_info in test_routes {
handler := hono.ContextHandler{
path: route_info['route']
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
fast_router.add_route('GET', handler, '') or {
println(' ❌ 快速路由器添加路由失败: ${err}')
continue
}
}
iterations := 5000
// 测试原始路由器
old_router.clear_cache()
old_router.clear_regex_cache()
start_time1 := time.now()
mut old_matches := 0
for _ in 0 .. iterations {
for route_info in test_routes {
if _ := old_router.match_route('GET', route_info['path']) {
old_matches++
}
}
}
old_time := time.since(start_time1)
// 测试快速路由器
fast_router.clear_cache()
start_time2 := time.now()
mut fast_matches := 0
for _ in 0 .. iterations {
for route_info in test_routes {
if _ := fast_router.match_route('GET', route_info['path']) {
fast_matches++
}
}
}
fast_time := time.since(start_time2)
println(' 多路由匹配性能 (${iterations}轮 × ${test_routes.len}路由):')
if old_matches > 0 {
avg_old := f64(old_time.microseconds()) / f64(old_matches)
println(' 原始路由器: ${old_time} (平均 ${avg_old:.3f}μs)')
}
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
println(' 快速路由器: ${fast_time} (平均 ${avg_fast:.3f}μs)')
if old_matches > 0 {
avg_old := f64(old_time.microseconds()) / f64(old_matches)
if avg_old > avg_fast {
improvement := avg_old / avg_fast
println(' 🚀 快速路由器提升: ${improvement:.2f}x')
}
}
}
// 显示统计信息
old_static, old_dynamic := old_router.get_all_routes()
fast_static, fast_dynamic := fast_router.get_all_routes()
println('\n 路由统计:')
println(' 原始路由器 - 静态: ${old_static.len}, 动态: ${old_dynamic.len}')
println(' 快速路由器 - 静态: ${fast_static.len}, 动态: ${fast_dynamic.len}')
}
fn test_large_scale_performance() {
println('\n📊 大规模路由性能对比...')
// 创建大量路由
mut old_router := hono.ContextHybridRouter.new()
mut fast_router := hono.FastRouter.new()
route_count := 100
for i in 0 .. route_count {
route_path := '/api/v${i}/resources/:id/items/:item_id'
old_handler := hono.ContextHandler{
path: route_path
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
old_router.add_route('GET', old_handler, '')
fast_handler := hono.ContextHandler{
path: route_path
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
fast_router.add_route('GET', fast_handler, '') or {
continue
}
}
// 测试路径
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
// 测试原始路由器
start_time1 := time.now()
mut old_matches := 0
for _ in 0 .. iterations {
for path in test_paths {
if _ := old_router.match_route('GET', path) {
old_matches++
}
}
}
old_time := time.since(start_time1)
// 测试快速路由器
start_time2 := time.now()
mut fast_matches := 0
for _ in 0 .. iterations {
for path in test_paths {
if _ := fast_router.match_route('GET', path) {
fast_matches++
}
}
}
fast_time := time.since(start_time2)
println(' 大规模路由匹配 (${route_count}个路由, ${iterations}轮 × ${test_paths.len}路径):')
if old_matches > 0 {
avg_old := f64(old_time.microseconds()) / f64(old_matches)
println(' 原始路由器: ${old_time} (平均 ${avg_old:.3f}μs)')
}
if fast_matches > 0 {
avg_fast := f64(fast_time.microseconds()) / f64(fast_matches)
println(' 快速路由器: ${fast_time} (平均 ${avg_fast:.3f}μs)')
if old_matches > 0 {
avg_old := f64(old_time.microseconds()) / f64(old_matches)
if avg_old > avg_fast {
improvement := avg_old / avg_fast
println(' 🚀 快速路由器提升: ${improvement:.2f}x')
}
}
}
}
fn test_cache_effectiveness() {
println('\n📊 缓存效果对比...')
route_path := '/api/:version/users/:user_id/posts/:post_id'
test_path := '/api/v1/users/123/posts/456'
// 创建快速路由器
mut fast_router := hono.FastRouter.new()
handler := hono.ContextHandler{
path: route_path
handler: fn (mut c hono.Context) http.Response {
return c.text('test')
}
}
fast_router.add_route('GET', handler, '') or {
println(' ❌ 添加路由失败')
return
}
iterations := 10000
// 测试启用缓存
fast_router.set_cache_enabled(true)
fast_router.clear_cache()
start_time1 := time.now()
mut cache_matches := 0
for _ in 0 .. iterations {
if _ := fast_router.match_route('GET', test_path) {
cache_matches++
}
}
cache_time := time.since(start_time1)
// 测试禁用缓存
fast_router.set_cache_enabled(false)
start_time2 := time.now()
mut no_cache_matches := 0
for _ in 0 .. iterations {
if _ := fast_router.match_route('GET', test_path) {
no_cache_matches++
}
}
no_cache_time := time.since(start_time2)
println(' 缓存效果测试 (${iterations}次):')
if cache_matches > 0 {
avg_cache := f64(cache_time.microseconds()) / f64(cache_matches)
println(' 启用缓存: ${cache_time} (平均 ${avg_cache:.3f}μs)')
}
if no_cache_matches > 0 {
avg_no_cache := f64(no_cache_time.microseconds()) / f64(no_cache_matches)
println(' 禁用缓存: ${no_cache_time} (平均 ${avg_no_cache:.3f}μs)')
if cache_matches > 0 {
avg_cache := f64(cache_time.microseconds()) / f64(cache_matches)
if avg_no_cache > avg_cache {
improvement := avg_no_cache / avg_cache
println(' 🚀 缓存提升: ${improvement:.2f}x')
}
}
}
// 显示统计
fast_router.set_cache_enabled(true)
fast_router.analyze_performance()
}