refc: Refactor project structure

This commit is contained in:
meiseayoung
2025-12-30 11:00:46 +08:00
parent 369655a9ea
commit 782a4e7795
106 changed files with 947 additions and 4184 deletions
+242
View File
@@ -0,0 +1,242 @@
import hono
import net.http
import os
import time
import strings
fn main() {
println('=== 文件流式传输测试 ===')
// 创建测试文件
create_test_files()
// 创建应用
mut app := hono.Hono.new()
// 测试路由
setup_test_routes(mut app)
// 在后台启动服务器
go app.listen(':8081')
// 等待服务器启动
time.sleep(2 * time.second)
println('服务器已启动在 http://localhost:8081')
// 执行测试
run_tests()
println('\n所有测试完成!')
}
fn create_test_files() {
println('创建测试文件...')
// 创建小文件 (1KB)
small_content := 'Hello World! '.repeat(80) // 约1KB
os.write_file('test_small.txt', small_content) or { panic(err) }
println(' 创建小文件: test_small.txt (${small_content.len} bytes)')
// 创建中等文件 (1MB)
mut medium_content := strings.new_builder(1024 * 1024)
for i in 0 .. 1000 {
medium_content.write_string('This is line ${i:04d} with some content to make it longer.\n')
}
medium_str := medium_content.str()
os.write_file('test_medium.txt', medium_str) or { panic(err) }
println(' 创建中等文件: test_medium.txt (${medium_str.len} bytes)')
// 创建大文件 (模拟5MB)
mut large_content := strings.new_builder(5 * 1024 * 1024)
base_line := 'This is a long line of text that will be repeated many times to create a large file for testing streaming functionality. '
for i in 0 .. 50000 { // 约5MB
large_content.write_string('${i:06d}: $base_line\n')
}
large_str := large_content.str()
os.write_file('test_large.txt', large_str) or { panic(err) }
println(' 创建大文件: test_large.txt (${large_str.len} bytes)')
}
fn setup_test_routes(mut app hono.Hono) {
// 传统文件服务(内存加载)
app.get('/traditional/:filename', fn (mut c hono.Context) http.Response {
filename := c.params['filename']
return c.file(filename)
})
// 流式文件服务
app.get('/stream/:filename', fn (mut c hono.Context) http.Response {
filename := c.params['filename']
return c.file_stream(filename)
})
// 智能文件服务(自动选择)
app.get('/smart/:filename', fn (mut c hono.Context) http.Response {
filename := c.params['filename']
return c.file_smart(filename)
})
// 带自定义选项的流式服务
app.get('/custom/:filename', fn (mut c hono.Context) http.Response {
filename := c.params['filename']
options := hono.FileOptions{
stream_threshold: 100 * 1024 // 100KB阈值
buffer_size: 4096 // 4KB缓冲区
enable_range: true
max_age: 3600
}
return c.file_stream_with_options(filename, options)
})
// Range请求测试
app.get('/range/:filename', fn (mut c hono.Context) http.Response {
filename := c.params['filename']
options := hono.FileOptions{
enable_range: true
stream_threshold: 1024 // 1KB阈值,强制使用流式传输
}
return c.file_stream_with_options(filename, options)
})
}
fn run_tests() {
println('\n开始性能测试...')
// 测试1:小文件性能对比
test_small_file_performance()
// 测试2:中等文件性能对比
test_medium_file_performance()
// 测试3:大文件性能对比
test_large_file_performance()
// 测试4:Range请求测试
test_range_requests()
// 测试5:智能选择测试
test_smart_selection()
}
fn test_small_file_performance() {
println('\n--- 小文件性能测试 ---')
// 传统方式
start := time.now()
for i in 0 .. 100 {
_ = os.execute('curl -s http://localhost:8081/traditional/test_small.txt > nul')
}
traditional_time := time.now() - start
println('传统方式 100次请求: $traditional_time')
// 流式方式
start2 := time.now()
for i in 0 .. 100 {
_ = os.execute('curl -s http://localhost:8081/stream/test_small.txt > nul')
}
stream_time := time.now() - start2
println('流式方式 100次请求: $stream_time')
// 智能方式
start3 := time.now()
for i in 0 .. 100 {
_ = os.execute('curl -s http://localhost:8081/smart/test_small.txt > nul')
}
smart_time := time.now() - start3
println('智能方式 100次请求: $smart_time')
}
fn test_medium_file_performance() {
println('\n--- 中等文件性能测试 ---')
// 传统方式
start := time.now()
for i in 0 .. 10 {
_ = os.execute('curl -s http://localhost:8081/traditional/test_medium.txt > nul')
}
traditional_time := time.now() - start
println('传统方式 10次请求: $traditional_time')
// 流式方式
start2 := time.now()
for i in 0 .. 10 {
_ = os.execute('curl -s http://localhost:8081/stream/test_medium.txt > nul')
}
stream_time := time.now() - start2
println('流式方式 10次请求: $stream_time')
}
fn test_large_file_performance() {
println('\n--- 大文件性能测试 ---')
// 只测试流式方式,避免内存问题
start := time.now()
for i in 0 .. 5 {
result := os.execute('curl -s http://localhost:8081/stream/test_large.txt > nul')
if result.exit_code != 0 {
println(' 请求 $i 失败')
}
}
stream_time := time.now() - start
println('流式方式 5次大文件请求: $stream_time')
// 智能方式(应该自动选择流式传输)
start2 := time.now()
for i in 0 .. 5 {
result := os.execute('curl -s http://localhost:8081/smart/test_large.txt > nul')
if result.exit_code != 0 {
println(' 智能方式请求 $i 失败')
}
}
smart_time := time.now() - start2
println('智能方式 5次大文件请求: $smart_time')
}
fn test_range_requests() {
println('\n--- Range请求测试 ---')
// 测试部分内容请求
result1 := os.execute('curl -s -H "Range: bytes=0-99" http://localhost:8081/range/test_medium.txt')
if result1.exit_code == 0 {
println('✅ Range请求 0-99: 成功')
} else {
println('❌ Range请求 0-99: 失败')
}
result2 := os.execute('curl -s -H "Range: bytes=100-199" http://localhost:8081/range/test_medium.txt')
if result2.exit_code == 0 {
println('✅ Range请求 100-199: 成功')
} else {
println('❌ Range请求 100-199: 失败')
}
}
fn test_smart_selection() {
println('\n--- 智能选择测试 ---')
// 测试小文件(应该使用内存加载)
result1 := os.execute('curl -s http://localhost:8081/smart/test_small.txt')
if result1.exit_code == 0 {
println('✅ 智能选择小文件: 成功')
} else {
println('❌ 智能选择小文件: 失败')
}
// 测试大文件(应该使用流式传输)
result2 := os.execute('curl -s -o large_output.txt http://localhost:8081/smart/test_large.txt')
if result2.exit_code == 0 {
// 检查下载的文件大小
if os.exists('large_output.txt') {
downloaded_size := os.file_size('large_output.txt') or { 0 }
original_size := os.file_size('test_large.txt') or { 0 }
if downloaded_size == original_size {
println('✅ 智能选择大文件: 成功 (${downloaded_size} bytes)')
} else {
println('❌ 智能选择大文件: 大小不匹配 (${downloaded_size} vs ${original_size})')
}
os.rm('large_output.txt') or {}
}
} else {
println('❌ 智能选择大文件: 失败')
}
}