# coronet
**Repository Path**: lsqyling/coronet
## Basic Information
- **Project Name**: coronet
- **Description**: 跨平台高性能异步 I/O 库 · C++20 协程架构
- **Primary Language**: C++
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-06-28
- **Last Updated**: 2026-07-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# coronet
**C++20 协程 · 跨平台 · 高性能异步 I/O 库**
---
## ✨ 核心亮点
| 🎯 | 特性 | 说明 |
|:--:|------|------|
| 🔒 | **TLS 加密传输** | `tls_socket` / `tls_context` / `tls_acceptor`,OpenSSL 3.x,双向验证 + ALPN |
| 🔌 | **三后端热插拔** | epoll(默认)⇄ io_uring(`-DCORONET_IOURING=ON`)⇄ IOCP(Windows 自动) |
| 🖥️ | **全编译器跨平台** | Linux GCC 13 / Clang 18 + Windows MSVC 19.41,一套代码 |
| ⚡ | **编译期零开销多态** | CRTP + `#ifdef` 平台选择,无虚表、无堆分配 Proactor |
| 🔗 | **链式 co_await** | `co_await (recv && send)` 单次挂起完成两个 I/O 操作 |
| 🧵 | **协程同步原语** | mutex / condition_variable / semaphore / channel / when_all·any·some |
| 📊 | **统一压测驱动** | `stress_driver --server name:binary:port` 自动采集 RPS + CPU + 内存 |
## 🚀 性能速览
**Redis PING 服务, 100K 请求 × 50 并发, WSL2 epoll**
| 服务端 | RPS | CPU% | 内存 |
|--------|-----:|:---:|-----:|
| coronet ST (协程) | 19,952 | 83.6% | 3.9 MB |
| coronet chain (链式) | 14,051 | 87.1% | 3.9 MB |
| ASIO ST (回调) | 19,175 | 73.2% | 3.7 MB |
**三平台峰值 RPS(单线程)**
| 编译器 | coronet | 后端 |
|--------|-----:|------|
| MSVC 19.41 (Windows) | **58,384** 🏆 | IOCP |
| GCC 13.3 (Linux) | 48,662 | io_uring |
| Clang 18.1 (Linux) | 47,304 | io_uring |
**C1000K 压测 — 1,000,000 请求 × 1,000 并发, Windows 11 + MSVC 19.41 (IOCP)**
| 服务端(单线程) | RPS | CPU% | 内存 | 状态 |
|--------|-----:|:---:|-----:|:---:|
| coronet ST (协程) | **50,955** | 28.4% | 5 MB | ✅ |
| coronet chain (链式) | 50,375 | 30.7% | 5 MB | ✅ |
| ASIO ST (回调) | 46,705 | 40.8% | 5 MB | ✅ |
| **coronet vs ASIO** | **+9%** | **低 30%** | 持平 | — |
| 服务端(6 线程) | RPS | CPU% | 内存 | 状态 |
|--------|-----:|:---:|-----:|:---:|
| coronet MT (6) | **50,140** | 31.0% | 6 MB | ✅ |
| ASIO MT (6) | 30,071 | 80.4% | 6 MB | ✅ |
| **coronet vs ASIO** | **+67%** | **低 61%** | 持平 | — |
> 📖 详细文档 → [CodeReview 报告](doc/CodeReview.md) | [测试报告](doc/TestReport.md) | [API 手册](doc/ApiManual.md)
---
## 🔒 TLS 加密传输
30 秒搭建 TLS 回声服务:
```cpp
#include
#include
using namespace coronet;
task<> tls_session(tls_socket sock) {
char buf[1024];
while (int n = co_await sock.recv(buf)) {
co_await sock.send({buf, (size_t)n});
}
}
task<> tls_server(uint16_t port) {
tls_context ctx{tls_context::mode::server};
ctx.load_cert_file("server.crt", "server.key"); // PEM 证书
ctx.set_alpn({"http/1.1"});
tls_acceptor ac{inet_address{port}, ctx};
while (true) co_spawn(tls_session(co_await ac.accept_socket()));
}
// 客户端
task<> tls_client(const char* host) {
tls_context ctx{tls_context::mode::client};
ctx.set_verify_peer(true);
ctx.set_default_verify_paths(); // 系统 CA 证书
auto sock = co_await tls_socket::connect(host, ctx);
co_await sock.send(std::span{"PING", 4});
co_return;
}
```
特性:
- **BIO 桥接架构** — 内存 BIO 将同步 SSL 操作接入异步 I/O 事件循环
- **ALPN 协商** — `h2` / `http/1.1` 协议选择
- **双向验证** — 服务端出示证书,客户端可选验证
- **安全加固** — `SSL_OP_NO_COMPRESSION` / `SSL_OP_NO_RENEGOTIATION`
- **优雅关闭** — `close_graceful()` 完整双向 `SSL_shutdown`,避免 RST
> 构建:`cmake -DCORONET_WITH_TLS=ON ..`(默认启用),需 OpenSSL 3.x
> TLS API 完整文档 → [API 手册 §四](doc/ApiManual.md)
---
## ⚡ 快速开始
```bash
# 克隆(含子模块)
git clone --recursive https://github.com/lsqyling/coronet.git && cd coronet
# 已克隆但未拉取子模块时:
git submodule update --init --recursive
# Linux — 默认 epoll 后端(Release)
cmake -S . -B build -G Ninja
cmake --build build
cd build && ctest --output-on-failure
# 切换到 io_uring
cmake -S . -B build-uring -G Ninja -DCORONET_IOURING=ON
cmake --build build-uring
ctest --test-dir build-uring --output-on-failure
# Windows MSVC (Developer Command Prompt)
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failure
# Install coronet
cmake --install build --prefix D:/dev/local # windows msvc
cmake --install build --prefix /usr/local # linux
# how to use
find_package(coronet REQUIRED)
add_executable(your_timer your_timer.cpp)
target_link_libraries(your_timer PRIVATE coronet::coronet)
```
## 📖 30 秒示例
### Echo Server
```cpp
#include
using namespace coronet;
task<> session(int fd) {
char buf[1024];
while (true) {
int n = co_await async::recv(fd, buf);
if (n <= 0) break;
co_await async::send(fd, {buf, (size_t)n});
}
}
task<> server(uint16_t port) {
acceptor ac{inet_address{port}};
while (true)
co_spawn(session(co_await ac.accept()));
}
int main() {
io_context ctx;
ctx.co_spawn(server(8080));
ctx.start(); ctx.join();
}
```
### 同步原语
```cpp
// 互斥锁
mutex mtx;
task<> critical() {
auto g = co_await mtx.lock_guard();
/* 临界区 */
}
// 信号量 — 10 协程竞争 3 槽位
counting_semaphore sem{3};
task<> worker() { co_await sem.acquire(); /* ... */ sem.release(); }
// 条件变量
condition_variable cv; mutex m;
task<> waiter() {
auto lk = co_await m.lock_guard();
co_await cv.wait(m, [] { return ready; });
}
// CSP 通道 — 生产者/消费者
channel ch;
task<> producer() { co_await ch.release("msg"); }
task<> consumer() { auto s = co_await ch.acquire(); }
```
### 协程组合器 + 链式 I/O
```cpp
// 等待全部完成
auto [r0, r1] = co_await all(taskA(), taskB(), taskC());
// 首个完成者胜出
auto [idx, var] = co_await any(taskA(), taskB());
// 链式 co_await — 发送 PONG 同时接收下一条 PING
co_await (async::send(fd, pong) && async::recv(fd, buf));
```
---
## 🏗️ 架构
```
用户代码: task<> / shared_task<> / generator<>
↓ co_await
async::recv / send / accept / connect / timeout / ...
↓ 工厂函数 (编译期分派)
┌──────────┬──────────────┬──────────┐
│ epoll │ io_uring │ IOCP │ ← 三后端, 编译期选择
│ (默认) │ (CORONET_ │ (Windows │
│ │ IOURING=ON)│ 自动) │
└──────────┴──────────────┴──────────┘
↓
io_context (单线程事件循环)
├─ drain_cross_thread() 跨线程队列 → SPSC 环
├─ do_worker_part() SPSC 环 → resume 协程
├─ do_submission_part() 提交 I/O (仅 io_uring)
└─ do_completion_part() 收割完成事件
```
| 组件 | 职责 |
|------|------|
| `io_context` | 单线程事件循环,栈上 Proactor |
| `worker_meta` | SPSC 无锁环 + 跨线程队列 + I/O 计数器 |
| `task` | 惰性协程,父链内联恢复(零调度开销) |
| `shared_task` | 引用计数多等待者 |
| `epoll_awaiter_base` | CRTP 编译期多态(非虚函数) |
---
## 📊 调用流程 / Call-Flow Diagrams
下面通过 Mermaid 时序图和数据流图展示 coronet 核心机制的运行时调用关系。
### 1. Fibonacci 生成器 — 协程生命周期
`test/generator_gtest.cpp` 中 Fibonacci 测试用例的完整调用时序。
```mermaid
sequenceDiagram
participant Test
participant Fib as "fib() coroutine"
participant Promise as "promise_type"
participant Iterator as "_Gen_iter"
participant Awaiter as "_Element_awaiter"
participant Final as "_Final_awaiter"
Test->>Fib: fib() called
activate Fib
Note over Fib: 编译器分配协程帧
Fib->>Promise: promise_type::operator new
Fib->>Promise: initial_suspend() returns suspend_always
Fib->>Test: return generator handle
deactivate Fib
Note over Fib: 协程体尚未执行 - 惰性求值
rect rgb(240, 248, 255)
Note over Test,Iterator: 范围 for: begin()
Test->>Iterator: begin() calls _Coro.resume()
activate Iterator
Iterator->>Fib: 首次恢复执行
activate Fib
Note over Fib: a=0, b=1, while true
Fib->>Awaiter: co_yield a -> yield_value(a)
activate Awaiter
Note over Awaiter: 拷贝值, 存入 _Ptr
Awaiter->>Fib: await_suspend - 协程挂起
deactivate Awaiter
deactivate Fib
Iterator->>Test: return iterator handle
deactivate Iterator
Note over Test,Iterator: 第1次迭代: value = 0
Test->>Iterator: *it (operator*)
Iterator->>Iterator: _Coro.promise()._Top.promise()._Ptr
Iterator->>Test: 0
Test->>Test: results.push_back(0)
Test->>Iterator: ++it (operator++)
activate Iterator
Iterator->>Fib: _Top.resume()
activate Fib
Note over Fib: next=1, a=1, b=1
Fib->>Awaiter: co_yield 1 -> yield_value(1)
activate Awaiter
Awaiter->>Fib: await_suspend - 挂起
deactivate Awaiter
deactivate Fib
deactivate Iterator
Note over Test,Iterator: 重复 11 次...
Note over Test,Iterator: 最后一次: value = 89
Test->>Iterator: ++it (最后一次)
activate Iterator
Iterator->>Fib: _Top.resume()
activate Fib
Note over Fib: a=144 > 100, 循环退出
Fib->>Promise: return_void()
Promise->>Final: final_suspend()
activate Final
Note over Final: _Info == nullptr (无嵌套)
Final->>Final: return noop_coroutine()
deactivate Final
Note over Fib: done() == true
deactivate Fib
deactivate Iterator
Test->>Iterator: it == end -> 循环退出
Note over Test: range-for 结束
end
Test->>Fib: ~generator() 析构
activate Fib
Fib->>Promise: _Coro.destroy()
Note over Promise: 释放协程帧
deactivate Fib
```
---
### 2. 异步定时器 — 3 个并发定时器
`test/timer.cpp` 中启动 3 个定时器的测试。两个 1 秒定时器各运行 2 轮,一个 3 秒定时器运行 1 轮,外加 6 秒停止协程。
```mermaid
sequenceDiagram
participant Main
participant Ctx as io_context
participant EvLoop as EventLoop
participant T1 as "cycle_n (1s, 2rds)"
participant T1b as "cycle_n (1s, 2rds) rel"
participant T3 as "cycle_n (3s, 1rd)"
participant Stop as "stop_after (6s)"
participant Timer as "platform::timeout"
Main->>Ctx: co_spawn(task) x4
Note over Ctx: 全部协程在 initial_suspend 挂起
Main->>Ctx: start() (启动事件循环线程)
activate EvLoop
EvLoop->>EvLoop: drain_cross_thread()
EvLoop->>EvLoop: do_worker_part()
par 定时器并行启动
T1->>T1: co_await async::timeout(1s)
T1->>Timer: 注册定时器
T1->>T1: suspend
T1b->>T1b: co_await async::timeout(1s)
T1b->>Timer: 注册定时器
T1b->>T1b: suspend
T3->>T3: co_await async::timeout(3s)
T3->>Timer: 注册定时器
T3->>T3: suspend
Stop->>Stop: co_await async::timeout(6s)
Stop->>Timer: 注册定时器
Stop->>Stop: suspend
end
Note over Timer: ~1 秒后
Timer->>EvLoop: 两个 1s 定时器到期
EvLoop->>EvLoop: handle_completion -> forward_task
EvLoop->>T1: resume (第1轮完成)
EvLoop->>T1b: resume (第1轮完成)
T1->>Timer: 第2轮 co_await async::timeout(1s)
T1b->>Timer: 第2轮 co_await async::timeout(1s)
Note over Timer: ~2 秒后
Timer->>EvLoop: 两个 1s 定时器再次到期
EvLoop->>T1: resume (第2轮完成, 退出)
EvLoop->>T1b: resume (第2轮完成, 退出)
Note over Timer: ~3 秒后
Timer->>EvLoop: 3s 定时器到期
EvLoop->>T3: resume (完成, 退出)
Note over Timer: ~6 秒后
Timer->>EvLoop: 6s 定时器到期
EvLoop->>Stop: resume
Stop->>Ctx: can_stop()
Ctx->>EvLoop: will_stop_ = true
deactivate EvLoop
Main->>Ctx: join() 返回, 测试结束
```
```mermaid
flowchart TD
A["cycle_n 协程
co_await async::timeout(D)"] --> B["make_timeout(dur)
async_io.hpp 工厂函数"]
B --> C["platform_io::make_timeout(dur)"]
C --> D{"编译期平台选择
Compile-time dispatch"}
D -->|Windows IOCP| E1["win_timeout::issue_io()
iocp_win_io.hpp:408"]
E1 --> F1["后台线程 / Background thread
Sleep(ms)"]
F1 --> G1["on_sync_completion()
PostQueuedCompletionStatus"]
D -->|Linux io_uring| E2["io_uring_timeout
prep_timeout(SQE)"]
E2 --> F2["do_submission_part()
io_uring_enter 提交"]
F2 --> G2["内核 CQE ready
IORING_OP_TIMEOUT"]
D -->|Linux epoll| E3["epoll_timeout
timerfd_settime()"]
E3 --> F3["epoll_wait 返回"]
F3 --> G3["do_perform → read timerfd"]
G1 --> H["proactor.wait_completion()
收割完成事件"]
G2 --> H
G3 --> H
H --> I["worker_meta::handle_completion()
解码 task_info, 设置 result"]
I --> J["forward_task(handle)
→ SPSC 环 (lock-free)"]
J --> K["do_worker_part()
从 SPSC 环弹出"]
K --> L["coroutine_handle::resume()"]
L --> M["co_await async::timeout() 返回"]
M --> A
```
---
### 3. CSP 通道 — 3 生产者 / 3 消费者
`test/channel.cpp` 测试:3 个生产者各发送 4 条消息(2 条快速 + 2 条带 200ms 延迟),共 12 条消息被 3 个消费者并发消费。
```mermaid
sequenceDiagram
participant Main
participant Ctx as io_context
participant EvLoop as EventLoop
participant P0 as "produce(p0)"
participant P1 as "produce(p1)"
participant P2 as "produce(p2)"
participant C0 as "consume(c0)"
participant C1 as "consume(c1)"
participant C2 as "consume(c2)"
participant Ch as "channel (buffer=4)"
participant Stop as "stopper (8s)"
Main->>Ctx: co_spawn 7 tasks (3P + 3C + stopper)
Main->>Ctx: start()
activate EvLoop
EvLoop->>EvLoop: drain_cross_thread + do_worker_part
par 快速生产阶段
P0->>Ch: release("p0: fast produce") 第1次
Note over Ch: lock, !full(), construct_at, push_one
unlock, notify not_empty
P0->>Ch: release("p0: fast produce") 第2次
P1->>Ch: release("p1: fast produce") x2
P2->>Ch: release("p2: fast produce") x2
end
Note over Ch: 缓冲占用: 6/4 (部分生产者等待 not_full)
par 消费阶段
C0->>Ch: acquire()
Note over Ch: lock, !empty(), move item
destroy_at, pop_one, unlock
Ch->>C0: return string
C0->>C0: printf (1/12)
C1->>Ch: acquire()
Ch->>C1: return string
C1->>C1: printf (2/12)
C2->>Ch: acquire()
Ch->>C2: return string
C2->>C2: printf (3/12)
end
par 慢速生产 + 消费交替
P0->>P0: async::timeout(200ms)
P0->>Ch: release("p0: slow produce")
C0->>Ch: acquire()
Ch->>C0: return string
Note over C0,C2: ... 共 12 条消息全部消费 ...
end
Note over C0,C2: 全部 12 条消息消费完毕
Note over Stop: 安全兜底: 8 秒后强制停止
Stop->>Ctx: can_stop()
Ctx->>EvLoop: will_stop_ = true
deactivate EvLoop
Main->>Ctx: join() 返回
Note over Main: assert(msg_consumed >= 12)
```
---
### 4. TCP Echo 服务器/客户端 — 双线程 Echo
`examples/echo_server_client.cpp` 中服务器端和客户端的完整调用时序和数据流。
```mermaid
sequenceDiagram
participant Main
participant SCtx as server_ctx
participant Svr as echo_server
participant Ses as echo_session
participant CCtx as client_ctx
participant Cli as echo_client
participant SkC as socket(client)
participant SkS as socket(server)
participant TCP as TCP Kernel
Note over Main: === 阶段 1: 启动服务器 ===
Main->>SCtx: co_spawn(echo_server())
SCtx->>Svr: resume
activate Svr
Note over Svr: acceptor(inet_address{9090})
create_tcp → set_reuse → bind → listen
Svr->>SkS: co_await ac.accept()
Note over Svr: 挂起, 等待连接 / suspended, waiting for connection
deactivate Svr
Note over Main: sleep(100ms) — 给服务器时间启动
Note over Main: === 阶段 2: 客户端连接 ===
Main->>CCtx: co_spawn(echo_client(...))
CCtx->>Cli: resume
activate Cli
Cli->>Cli: inet_address::resolve("127.0.0.1", 9090)
Cli->>SkC: socket::create_tcp()
Cli->>SkC: co_await sock.connect(addr)
SkC->>TCP: SYN
TCP->>SkS: 连接到达, accept 被唤醒
activate Svr
SkS->>Svr: accept 返回新连接 fd
deactivate Svr
Svr->>Ses: co_spawn(echo_session(sock))
activate Ses
SkC->>Cli: connect 返回 0 (连接成功)
deactivate Cli
Note over Main: === 阶段 3: 数据收发 (Echo) ===
Cli->>SkC: co_await sock.send(TestMsg)
SkC->>TCP: TCP 数据包
TCP->>SkS: 数据到达
Ses->>SkS: co_await sock.recv(buf)
SkS->>Ses: recv 返回 nr 字节
Ses->>SkS: co_await sock.send(buf, nr)
SkS->>TCP: Echo 数据
TCP->>SkC: Echo 返回
Cli->>SkC: co_await sock.recv(buf)
SkC->>Cli: recv 返回, 验证 Echo 内容
Note over Main: === 阶段 4: 清理 ===
Cli->>SkC: co_await sock.shutdown_write()
Cli->>CCtx: ctx.can_stop()
CCtx->>Main: join() 返回
Main->>SCtx: ctx.can_stop()
SCtx->>Main: join() 返回
deactivate Ses
```
```mermaid
flowchart LR
subgraph Main_Thread["主线程 / Main Thread (client_ctx)"]
CL[echo_client 协程]
SKC[socket client
RAII fd]
end
subgraph Server_Thread["后台线程 / Server Thread (server_ctx)"]
SV[echo_server 协程]
AC[acceptor
listen socket]
SS[echo_session 协程]
SKS[socket server
RAII fd]
end
subgraph Kernel["操作系统内核 / Kernel"]
TCP["TCP/IP 协议栈
(loopback/Linux/Windows)"]
end
CL -->|"① connect(127.0.0.1:9090)"| SKC
SKC -->|"SYN →"| TCP
TCP -->|"accept 唤醒"| AC
AC -->|"返回 connected fd"| SV
SV -->|"co_spawn"| SS
CL -->|"② send(TestMsg)"| SKC
SKC -->|"TCP data →"| TCP
TCP -->|"→ data in"| SKS
SKS -->|"③ recv(buf)"| SS
SS -->|"④ send({buf, nr})"| SKS
SKS -->|"TCP echo →"| TCP
TCP -->|"→ echo data"| SKC
SKC -->|"⑤ recv(buf)"| CL
CL -->|"⑥ 验证 echo 内容"| CL
CL -->|"⑦ shutdown_write + can_stop()"| CL
style CL fill:#d4f0d4,stroke:#333
style SS fill:#d4f0d4,stroke:#333
style AC fill:#e8e8ff,stroke:#333
style TCP fill:#fff3cd,stroke:#333
style SKC fill:#f0f0f0,stroke:#999
style SKS fill:#f0f0f0,stroke:#999
```
---
## 🌿 分支与构建模式
| 分支 | `CORONET_DEVELOPER_MODE` | 构建目标 | 子模块 |
|:-----|:---:|------|:---:|
| `main` / `master` | **自动 OFF** | 仅库 (`coronet`) | 可选 |
| `develop` / 其他 | **自动 ON** | 库 + 测试 + 示例 + 基准 + 压测 | **必须** |
CMake 配置时会自动执行 `git rev-parse --abbrev-ref HEAD` 检测当前分支,`main`/`master` 默认关闭开发模式,其余分支默认开启。**同一份代码,不同分支自动走不同默认值**,无需手动修改 `Option.cmake`。
`CORONET_DEVELOPER_MODE` 是一个批量开关,会同时开启 `CORONET_BUILD_{TESTS,BENCHMARKS,STRESS_TESTS,EXAMPLES}`。使用者可以根据需要单独控制:
```bash
# main 分支用户 — 仅编译库(默认)
cmake -S . -B build -G Ninja
# develop 分支用户 — 编译全部(默认,需要子模块)
git clone --recursive https://github.com/lsqyling/coronet.git
cmake -S . -B build -G Ninja
# 手动关闭开发模式,回到纯库模式
cmake -S . -B build -G Ninja -DCORONET_DEVELOPER_MODE=OFF
# 仅开启测试,不构建基准和示例
cmake -S . -B build -G Ninja -DCORONET_DEVELOPER_MODE=OFF -DCORONET_BUILD_TESTS=ON
```
---
## 📦 CMake 选项
| 选项 | 默认 | 说明 |
|------|:---:|------|
| `CORONET_DEVELOPER_MODE` | auto* | 批量开启测试/示例/基准/压测(自动检测 git 分支) |
| `CORONET_IOURING` | OFF | 启用 io_uring 替代 epoll |
| `CORONET_BUILD_TESTS` | OFF | 单元测试 (gtest) |
| `CORONET_BUILD_BENCHMARKS` | OFF | 微基准 (Google Benchmark) |
| `CORONET_BUILD_STRESS_TESTS` | OFF | 压力测试 |
| `CORONET_BUILD_EXAMPLES` | OFF | 示例程序 |
> \* `main`/`master` 分支自动 OFF,其余分支自动 ON;可通过 `-DCORONET_DEVELOPER_MODE=ON/OFF` 手动覆盖
---
## 🧪 CTest 测试矩阵
> 完整测试方法与用例清单 → [doc/TestManual.md](doc/TestManual.md)
```bash
# 运行全部
ctest --output-on-failure -j4
# 分类运行
ctest -R gtest # 单元测试 (18 用例)
ctest -R benchmark # Google Benchmark
ctest -R stress_driver # 压测 (ST / MT)
```
| 平台 / 编译器 | 后端 | 测试数 | 结果 |
|:---|:---|:---:|:---:|
| Linux GCC 13.3 | epoll | 27/27 | ✅ |
| Linux Clang 18.1 | epoll | 27/27 | ✅ |
| Linux GCC 13.3 | io_uring | 27/27 | ✅ |
| Windows MSVC 19.41 | IOCP | 27/27 | ✅ |
---
## 🔬 压力测试
```bash
# 构建
cmake -S . -B build -DCORONET_BUILD_STRESS_TESTS=ON
cmake --build build
# CTest 单线程对比
ctest -R stress_driver_ST
# 手动 — 自定义服务端
./stress_driver \
--server "coronet_ST:redis_echo_ST:6380" \
--server "ASIO_ST:redis_echo_asio_ST:6382" \
-n 100000 -c 100 -v
```
添加新服务端**无需改 stress_driver 代码** — 在 CMakeLists 中追加 `--server name:binary:port` 即可。
### C1000K 百万级压测
C1000K 基准脚本(1M 请求 × 1K 并发)已移至 `script/`,原始报告存于 `data/bench_c1000k/`:
```bash
# Linux (epoll / io_uring)
bash script/linux/bench_c1000k.sh
# Windows (IOCP)
pwsh script/win/bench_c1000k.ps1
```
> 完整 C1000K 结果与结论 → [doc/BENCHMARK_REPORT.md](doc/BENCHMARK_REPORT.md)
---
## 📂 目录
```
coronet/
├── include/coronet/ # 公共头文件
│ ├── task.hpp # 惰性协程
│ ├── async_io.hpp # 跨平台 I/O 工厂
│ ├── io_context.hpp # 事件循环
│ ├── net/ # socket / acceptor
│ ├── co/ # mutex / cv / sem / channel
│ ├── platform/ # epoll / io_uring / IOCP
│ └── detail/ # 内部实现
├── src/coronet/ # .cpp 实现
├── test/ # 19 项 CTest (4 gtest + 15 集成)
├── bench/ # Google Benchmark
├── stress-test/ # 压测驱动 + 服务端源码
├── examples/ # 示例程序
├── script/ # 构建与压测脚本
│ ├── linux/ # .sh / .py (epoll / io_uring)
│ └── win/ # .ps1 / .bat (IOCP)
├── data/ # 测试数据 / 压测结果
│ └── bench_c1000k/ # C1000K 压测报告 (csv + txt)
├── doc/ # 性能报告 / 测试报告 / API 手册
└── cmake/ # CMake 模块
```
---
## 📜 许可
[Apache License](./LICENSE)
---
本项目代码由 **Claude Code** (Deepseek) 辅助生成,采用 AI Vibe Coding 开发方式。人工进行需求定义、架构设计审核、代码审查及测试验证。