Releases: funnywwh/zco
0.5.0
Highlights
HTTP 示例默认并发参数调优:worker_pool_size=512, channel_buffer=8192, max_connections=10000
默认启用 Streaming Parser,提升高并发与大报文稳定性
新增脚本 scripts/http_bench.sh:一键 start/stop/ab/wrk
Benchmarks (local, c=400)
ab -k: RPS≈10207, P99≈46ms, Failed=0
ab : RPS≈10144, P99≈47ms, Failed=0
wrk 30s: RPS≈9935, Avg≈39.8ms
Notes
建议 ulimit -n 1048576, sysctl net.core.somaxconn=65535
详细输出见 benchmarks/results/ 与 README.md
0.4.2
0.4.1 环形缓冲区+优先级位图调度器
ZCO v0.4.1 Release
🎉 主要更新
本版本实现了环形缓冲区+优先级位图调度器,这是调度器架构的重大升级!
✨ 新特性
1. 环形缓冲区+优先级位图调度器
- O(1) 优先级查找: 使用32位位图实现常数时间查找最高优先级协程
- 多优先级支持: 支持0-31共32个优先级级别的独立队列
- O(1) 入队/出队: 每个优先级使用独立的环形缓冲区
- 内存优化: 环形缓冲区避免频繁内存分配,提高性能
2. 可配置参数
RING_BUFFER_SIZE = 2048- 每个优先级的环形缓冲区大小(可配置)MAX_PRIORITY_LEVELS = 32- 支持的优先级级别数量
3. 新增 API
// 带优先级的协程创建
pub fn goWithPriority(
self: *Schedule,
comptime func: anytype,
args: anytype,
priority: usize
) !*Co
// 队列统计信息
pub fn count(self: *const RingBufferPriorityQueue) usize
pub fn isEmpty(self: *const RingBufferPriorityQueue) bool
pub fn getPriorityCount(self: *const RingBufferPriorityQueue, priority: usize) usize
pub fn getHighestPriority(self: *const RingBufferPriorityQueue) ?usize🚀 性能提升
时间复杂度
- 查找最高优先级: O(log n) → O(1) ⚡
- 入队操作: O(1) (保持不变)
- 出队操作: O(1) (保持不变)
内存占用
- 增加: 约256KB (32 × 2048 × 4字节指针)
- 优势: 支持32个优先级级别的独立队列,避免动态分配
🔧 技术亮点
优先级位图操作
// 设置优先级位
self.priority_bitmap |= (@as(u32, 1) << @intCast(priority));
// 查找最高优先级 (O(1))
const highest_priority = 31 - @clz(self.priority_bitmap);
// 清除优先级位
self.priority_bitmap &= ~(@as(u32, 1) << @intCast(priority));环形缓冲区设计
const RingBufferPriorityQueue = struct {
rings: [MAX_PRIORITY_LEVELS]RingBuffer, // 32个优先级的环形缓冲区
priority_bitmap: u32, // 32位优先级位图
allocator: std.mem.Allocator,
};📖 使用示例
创建不同优先级的协程
// 高优先级协程
_ = try schedule.goWithPriority(highPriorityTask, .{}, 15);
// 中等优先级协程
_ = try schedule.goWithPriority(mediumPriorityTask, .{}, 5);
// 低优先级协程
_ = try schedule.goWithPriority(lowPriorityTask, .{}, 0);查询队列状态
// 获取总协程数
const total_count = schedule.readyQueue.count();
// 获取最高优先级
if (schedule.readyQueue.getHighestPriority()) |highest| {
std.log.info("当前最高优先级: {d}", .{highest});
}
// 获取指定优先级的协程数
const count = schedule.readyQueue.getPriorityCount(10);🧪 测试验证
- ✅ 基本调度功能正常
- ✅ 时间片抢占工作正常
- ✅ 协程交替执行正常
- ✅ 多优先级调度顺序正确
- ✅ 环形缓冲区循环使用正常
- ✅ 位图正确更新
📚 文档
- 技术文档:
docs/RING_BUFFER_PRIORITY_REPORT.md - 完整文档:
docs/目录包含14个文档文件 - 优化指南:
docs/PERFORMANCE_OPTIMIZATION_GUIDE.md
🔗 相关链接
🎯 向后兼容性
- ✅ 完全向后兼容现有API
- ✅ 默认优先级为0
- ✅ 现有代码无需修改即可使用
🙏 致谢
感谢所有贡献者和用户的支持!
ZCO 0.4.0 - 性能优化版本发布
ZCO 0.4.0 - 性能优化版本发布
重大性能更新:在调度器效率、内存管理和HTTP处理方面实现了显著改进。
⚡ 主要改进
• 低并发场景性能提升50%(超越Go 14.5%)
• 调度器效率从 O(log n) 优化到 O(1)
• 内存使用减少50%(栈大小:8KB → 4KB)
• 三级池化架构实现高效资源管理
📊 性能基准测试
| 测试场景 | ZCO RPS | 与Go对比 |
|---|---|---|
| 1000请求, 10并发 | 44,308 | 相比Go提升14.5% |
| 1万请求, 100并发 | 44,944 | 性能相当 |
| 5万请求, 500并发 | 43,646 | 性能相当 |
| 10万请求, 1000并发 | 36,938 | 性能相当 |
🔧 主要特性
调度器优化
• 基于ArrayList的调度(O(1)插入)
• 动态批处理(每批次16-128个协程)
• 优化的信号处理,减少系统调用
• 栈大小优化(8KB → 4KB)
内存管理
• 内存池(1000个1KB内存块,快速分配)
• 协程池(500个协程对象复用)
• 连接池(200个TCP连接复用)
• 内存对齐优化,提升缓存性能
网络优化
• TCP_NODELAY 降低延迟
• 连接池实现高效的TCP连接复用
• 优化的io_uring配置
HTTP性能
• SIMD加速字符串匹配(16字节向量化)
• 预编译HTTP响应
• 1000条目响应缓存
• 零拷贝缓冲区机制
• 直接字节比较替代indexOf
系统优化
• 关键路径的分支预测提示
• CPU亲和性接口(简化版)
• NUMA优化接口(简化版)
🎯 对您意味着什么
如果您使用ZCO进行:
• 高吞吐量应用:将看到显著的RPS改进
• 低延迟要求:网络优化减少响应时间
• 内存受限环境:内存占用减少50%
• 并发工作负载:负载下更好的调度器性能
📦 安装
zig build
或者使用标签:
git checkout 0.4.0
zig build
🔄 升级说明
无破坏性更改。这是一个专注于性能的发布,保持了完整的API兼容性。现有应用将无需任何代码更改即可自动获得性能改进。
📝 完整优化列表(18/20项已完成)
✅ ArrayList替代PriorityQueue
✅ 动态批处理
✅ 批量信号屏蔽
✅ 内存池实现
✅ 协程池实现
✅ 栈大小减少
✅ 内存对齐
✅ TCP_NODELAY
✅ 连接池
✅ 直接字节比较
✅ 预编译响应
✅ HTTP响应缓存
✅ 零拷贝缓冲区
✅ SIMD字符串匹配
✅ 分支预测
✅ CPU亲和性接口
✅ NUMA优化接口
✅ 性能监控
🐛 已知问题
• 在极端高并发场景(1000+并发)下性能略低于Go
• NUMA和CPU亲和性优化为简化版本
🔮 下一步计划
• 完整的NUMA支持
• 真正的CPU亲和性绑定
• 更智能的自适应调度算法
• 分布式协程调度
更多详细信息,请查看仓库中的 CHANGELOG_V0.4.0.md。
v0.3.2: 优化协程抢占信号处理机制
这是一个针对 v0.3.1 的 bugfix 版本,主要优化了协程抢占信号处理机制。
核心改进:
- 修复信号屏蔽恢复时机,避免竞态
- 简化抢占处理实现,用现有 API 替代手动上下文切换
- 同步优化测试代码与调试配置
技术亮点:
- 代码量减少约 88 行
- 提高抢占机制稳定性
- 保持与 v0.3.1 的性能表现
ZCO v0.3.1 - 协程级定时器生命周期管理
🚀 ZCO v0.3.1 - 协程级定时器生命周期管理
📋 版本概述
ZCO v0.3.1 引入了革命性的协程级定时器生命周期管理,实现了定时器与协程运行状态的完全绑定。这一重大更新不仅提供了更精确的协程调度控制,还带来了显著的性能提升。
✨ 主要新特性
🎯 协程级定时器生命周期管理
- 细粒度控制: 定时器生命周期与协程运行状态完全绑定
- 智能启动: 协程运行时自动启动定时器并重置计时(从0开始)
- 即时停止: 协程挂起时立即停止定时器,避免无效中断
- 资源优化: 空闲时不运行定时器,显著节省CPU资源
⚡ 性能大幅提升
- 低并发场景: RPS 提升 41% (25,970 → 36,593)
- 高并发场景: RPS 提升 16% (24,596 → 28,462)
- 响应时间: 全面改善 14-29%
- 资源效率: 空闲时CPU使用率显著降低
🔧 技术改进
架构优化
- 移除了
timer_started全局状态标志 - 实现了协程级别的定时器状态管理
- 优化了信号处理开销和CPU缓存局部性
调度器增强
- 每个协程获得完整时间片(从0开始计时)
- 避免了时间片碎片化问题
- 提高了协程切换的公平性
📊 性能基准测试
| 测试场景 | 版本 | RPS | 平均响应时间 | 性能提升 |
|---|---|---|---|---|
| 10,000/100 | v0.2.2 | 25,970 | 3.851ms | - |
| 10,000/100 | v0.3.1 | 36,593 | 2.733ms | +41% |
| 50,000/500 | v0.2.2 | 24,596 | 20.329ms | - |
| 50,000/500 | v0.3.1 | 28,462 | 17.567ms | +16% |
🛠️ API 变更
新增方法
// 停止定时器
pub fn stopTimer(self: *Schedule) void行为变更
startTimer()现在每次调用都会重置定时器- 协程
Resume()时自动启动定时器 - 协程
Suspend()时自动停止定时器 - 协程结束时自动停止定时器
📝 使用示例
// 协程级定时器生命周期示例
const s = try zco.getSchedule();
_ = try s.go(struct {
fn run() !void {
const co = try zco.getSchedule().getCurrentCo();
// 协程运行时,定时器自动启动并重置
std.log.info("协程开始运行,定时器已启动");
// 长时间计算...
for (0..1000000) |i| {
_ = i * 2;
}
// 主动挂起时,定时器自动停止
try co.Suspend();
std.log.info("协程挂起,定时器已停止");
// 恢复时,定时器重新启动并重置
try co.Resume();
std.log.info("协程恢复,定时器重新启动");
}
}.run, .{});🔄 迁移指南
从 v0.2.2 升级
- 无需代码修改: 所有现有代码完全兼容
- 自动优化: 定时器管理自动优化,无需手动干预
- 性能提升: 升级后自动获得性能提升
注意事项
- 定时器现在完全由协程生命周期管理
- 不再需要手动管理
timer_started状态 - 协程挂起时定时器会自动停止
🐛 修复和改进
- 修复了定时器在协程切换时的状态不一致问题
- 优化了高并发场景下的协程调度性能
- 改进了空闲状态下的资源使用效率
- 增强了协程调度的公平性
📚 文档更新
- 更新了 README.md 突出显示新特性
- 添加了详细的 CHANGELOG.md
- 完善了 API 文档和使用示例
🎯 适用场景
- 高并发网络服务器: 显著提升HTTP服务器性能
- 实时系统: 精确的协程调度控制
- 资源敏感应用: 空闲时自动节省CPU资源
- 协程密集型应用: 更好的调度公平性
🔗 相关链接
🙏 致谢
感谢所有贡献者和用户的支持,让 ZCO 能够持续改进和优化!
下载: ZCO v0.3.1
完整变更日志: CHANGELOG.md
0.3.0
0.2.3
基于从 v0.2.2 到现在的所有修改,我为您生成以下版本发布描述:
ZCO v0.2.3 发布说明
🚀 重大性能优化
核心性能提升
- 批量协程调度: 实现每次处理32个协程的批量调度机制,大幅提升调度效率
- 内存优化: 协程栈大小从32KB优化到8KB,节省75%内存使用
- 预编译HTTP响应: 避免运行时字符串操作,提升响应速度
- 连接数限制: 最大支持10,000个并发连接,防止内存爆炸
性能基准测试结果
- QPS性能:
- 100并发: 41,253 请求/秒
- 1000并发: 39,915 请求/秒
- 延迟表现:
- 低并发平均延迟: 2.4ms
- 高并发平均延迟: 25ms
- 稳定性: 0% 失败率,无内存泄漏
🔧 重要修复
协程和通道优化
- 修复通道
deinit断言问题,提高协程退出稳定性 - 修复
Chan.deinit内存泄漏问题 - 实现
Schedule.stop优雅退出机制,通过唤醒协程并返回错误实现 - 优化协程参数传递机制
网络和IO改进
Tcp.init现在返回指针,提高使用便利性- 修复IO关闭后
xobj = null的资源清理问题 - 添加
WaitGroup支持,增强并发控制能力
兼容性修复
- 修复 Zig 0.14.0-dev.3237+ 构建错误
- 更新版本要求到 Zig 0.14.0
- 修复所有模块的 xev 冲突问题
- 修复
build.zig.zon语法兼容性问题
📚 文档和工具完善
新增文档
- 创建
docs/目录统一管理文档 - 添加性能对比报告 (ZCO vs Go)
- 提供详细的性能优化指南
- 包含优化总结和使用示例
测试工具
- 新增 ZCO 性能测试脚本
- 提供 ZCO vs Go 对比测试脚本
- 包含性能优化示例代码
- 提供优化服务器示例
🎯 技术亮点
- 高性能: 在保持低延迟的同时实现高QPS
- 内存高效: 75%的内存使用优化
- 稳定可靠: 0%失败率,无内存泄漏
- 易于使用: 完善的文档和示例代码
- 现代兼容: 支持 Zig 0.14.0 最新特性
📦 升级建议
从 v0.2.2 升级到 v0.2.3 建议:
- 确保使用 Zig 0.14.0 或更高版本
- 重新编译所有依赖项目
- 查看新的性能优化指南以充分利用新特性
- 使用新的测试脚本验证性能提升
版本: v0.2.3
发布日期: 2025年10月23日
Zig版本要求: 0.14.0+
主要贡献者: winger