# librf 2.9.10
### librf - 协程库
* librf是一个基于C++20 coroutines编写的无栈协程库。
支持以下平台和编译器:
Windows: 使用VS2017/VS2019编译(clang在兼容msvc模式下不支持异常,不再支持clang)
Android: 使用NDK 20.1 自带的clang编译
Mac: 使用XCode 11.2.1 自带的apple-clang编译
Ubuntu: 使用GCC 11.2/clang 14 编译(2020-04-18:mutex ranged lock failed)
注意:GCC 10.0.1在C++ Coroutines上依然存在很多BUG。
当前阶段不推荐使用GCC(version 11.2以下)。
<br>
* 性能测试
本来无意搞性能测试的,因为librf的初衷和设计目标,就不是为了性能。然而,随着C++ Coroutines进入C++ 20标准,类似的协程库也越来越多。得益于C++ Coroutines的优良设计,他们的这些协程库都把性能放在首要位置进行宣传。裹挟着我也不得不进行一番性能调优,以及测试。
以下数据全是平局每个操作的时间开销。
| 编译器 | 操作系统 | [mimalloc](https://github.com/microsoft/mimalloc) | 多线程 | 创建*1 | 切换*1 | 创建*1000 | 切换*1000 | 创建*30000 | 切换*30000 |
| :----: | :----------- | :-----------------------------------------------: | :----: | :----: | :----: | :-------: | :-------: | :--------: | :--------: |
| clang | Windows10 | ON | OFF | 500 ns | 17 ns | 101 ns | **11 ns** | 90 ns | 12 ns |
| clang | Windows10 | **ON** | **ON** | 500 ns | 37 ns | 116 ns | **18 ns** | 103 ns | 20 ns |
| clang | Windows10 | OFF | OFF | 800 ns | 16 ns | 208 ns | **11 ns** | 186 ns | 15 ns |
| clang | Windows10 | OFF | ON | 900 ns | 37 ns | 240 ns | **18 ns** | 203 ns | 23 ns |
| clang | Ubuntu 20.04 | ON | OFF | 400 ns | 15 ns | 112 ns | **11 ns** | 108 ns | 12 ns |
| clang | Ubuntu 20.04 | **ON** | **ON** | 500 ns | 31 ns | 111 ns | **16 ns** | 109 ns | 17 ns |
| clang | Ubuntu 20.04 | OFF | OFF | 400 ns | 15 ns | 133 ns | **13 ns** | 149 ns | 15 ns |
| clang | Ubuntu 20.04 | OFF | ON | 500 ns | 30 ns | 140 ns | **17 ns** | 141 ns | 19 ns |
(测试环境:I7 8700K OC 4.3GHz,频率由于酷睿原因不是特别稳定)
多线程:调度器是否开启多线程支持。由于调度器里频繁用到自旋锁,导致在这种测试中数据较为难看。
创建*1:创建 1 个协程的平均开销;
切换*1:在只有 1 个协程的时候,切换 3000000 次的平均开销;
创建*1000:创建 1000 个协程的平均开销;
切换*1000:在具有 1000 个协程的时候,切换 3000000 次的平均开销;
创建*30000:创建 30000 个协程的平均开销;
切换*30000:在具有 30000 个协程的时候,切换 3000000 次的平均开销;
加粗的字,表示那一项应该是常规状态下的状态,具有较大参考价值。
<br>
* librf有以下特点:
```
1.基于C++20提案'Stackless Resumable Functions'编写的非对称stackless协程库,可以以同步的方式编写简单的代码,同时获得异步的性能
2.理论上支持海量协程, 创建 **10,000,000** 个协程只需使用 **2.2G** 物理内存(使用clang编译)
3.拥有极小的协程调度开销,在I7 8100 3.6GHz的CPU上,**1000** 个协程的平均切换开销是 **27** 纳秒(使用clang编译)
4.提供协程锁(mutex), 定时器, channel, event等特性, 帮助用户更加容易地编写程序
5.可以很好的跟asio, libuv等库结合,能跟现有的callback范式的异步/延迟代码很好的结合
6.目前已处于较为完善状态,已经小规模在生产项目中使用。不出意外,2.8以上版本就是C++20 Coroutines对应的版本
```
<br>
* 如果你发现了任何bug、有好的建议、或使用上有不明之处,可以提交到issue,也可以直接联系作者:
email: tearshark@163.net
QQ交流群: 296561497
<br>
* 更新日志:
2020-06-20 更新:
```
性能调优和测试数据
```
2020-03-31 更新:
使用Doxygen自动生成文档,并完善文档内容。
支持cmake。(目前仅VS2019测试通过)。
2020-03-26 更新:
兼容xcode 11.2.1。
2020-03-18 更新:
更新event/mutex/when_all/when_any实现。至此,2.x版本完整恢复1.x版本的所有功能。
版本号提升至 2.8.0。
3.0之前,只打算做修复BUG相关的工作。
3.0的目标,是根据executor的设计,重写scheduler代码。
2020-03-08 更新:
更新channel实现,效率提高了近三倍。
channel的新的实现方法,为event/mutex指明了新的修改方向。
2020-02-16 更新:
更新调度器算法,深入应用Coroutines的特性,以期获得更高调度性能。
不再支持C++14。
* 注一:doc目录下有作者搜集的一些关于C++协程的资料
* 注二:tutorial目录下有针对每个特性的范例代码,让用户可以循序渐进的了解librf库的特性
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
适合学习/练手、毕业设计、课程设计、期末/期中/大作业、工程实训、相关项目/竞赛学习等。 项目具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些基础上学习借鉴进行修改和扩展,实现其它功能。 可放心下载学习借鉴,你会有所收获。 —— 博主领域:嵌入式领域&人工智能&软件开发。 对于学习和实践,选择合适的项目和资源确实是一种有效的方式。 在进行毕业设计、课程设计或大作业时,选择具备学习借鉴价值的项目可以帮助你理解和应用所学知识,同时也可以通过修改和扩展来实现其他功能。 通过参与实际项目,你可以应用所学的理论知识,深入了解软件开发或其他领域的实践流程和技术要求。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
资源推荐
资源详情
资源评论
收起资源包目录
基于C++ Coroutines编写的无栈协程库.zip (104个子文件)
SelectDynamicLibrary.cmake 7KB
install.cmake 2KB
benchmark_asio_echo.cpp 7KB
test_async_channel.cpp 7KB
test_async_memory_layout.cpp 6KB
test_async_when_all.cpp 5KB
test_async_modern_cb.cpp 5KB
event_v2.cpp 5KB
test_async_mutex.cpp 5KB
state.cpp 5KB
test_async_switch_scheduler.cpp 4KB
scheduler.cpp 4KB
mutex_v2.cpp 4KB
test_async_event.cpp 4KB
test_async_event_timeout.cpp 4KB
test_async_cb.cpp 3KB
test_async_stop_token.cpp 3KB
gcc_bugs.cpp 3KB
test_async_channel_mult_thread.cpp 3KB
test_async_multi_thread.cpp 3KB
test_async_suspend_always.cpp 2KB
timer.cpp 2KB
test_async_event_v2.cpp 2KB
test_async_yield_return.cpp 2KB
test_librf.cpp 2KB
test_async_exception.cpp 2KB
test_async_resumable.cpp 2KB
benchmark_channel_passing_next.cpp 2KB
test_async_sleep.cpp 2KB
test_async_routine.cpp 1KB
test_async_dynamic_go.cpp 1KB
benchmark_async_mem.cpp 1KB
when_v2.cpp 1016B
test_memory_leak.cpp 977B
test_async_timer.cpp 771B
sleep.cpp 464B
rf_task.cpp 261B
Doxyfile 112KB
.gitignore 401B
.gitmodules 92B
when_v2.h 17KB
stop_token.h 14KB
state.h 8KB
coroutine.h 8KB
mutex_v2.h 8KB
event_v2.h 8KB
generator.h 7KB
spinlock.h 6KB
scheduler.h 6KB
timer.h 5KB
current_scheduler.h 5KB
awaitable.h 4KB
ring_queue.h 4KB
channel_v2.h 4KB
promise.h 4KB
switch_scheduler.h 4KB
intrusive_link_queue.h 4KB
sleep.h 3KB
rf_task.h 3KB
librf.h 3KB
counted_ptr.h 3KB
def.h 2KB
clang_builtin.h 2KB
_awaker.h 2KB
future.h 1KB
yield.h 1KB
gcc_builtin.h 455B
config.h 437B
asio_task.h 182B
channel.h 67B
mutex.h 63B
event.h 63B
when.h 61B
librf_macro.h 31B
config.h.in 601B
Config.cmake.in 106B
event_v2.inl 15KB
mutex_v2.inl 15KB
channel_v2.inl 14KB
type_traits.inl 9KB
state.inl 7KB
asio_task_1.12.0.inl 5KB
asio_task_1.12.2.inl 5KB
without_deadlock_assemble.inl 4KB
asio_task_1.10.0.inl 3KB
type_concept.inl 2KB
exception.inl 2KB
macro_def.inl 1KB
promise.inl 1KB
LICENSE 11KB
README.md 5KB
C++ Coroutines - Under The Covers - Gor Nishan.pdf 2.5MB
C++ Coroutines - Gor Nishanov - CppCon 2015 (1.pdf 1.35MB
CppNow2015_Coroutines_in_C++17.pdf 957KB
await 2.0 - Stackless Resumable Functions - Gor Nishanov - CppCon 2014.pdf 877KB
n4134-Resumable Functions v2 .pdf 821KB
n3964-Asynchronous Operations.pdf 735KB
n4649-Working Draft Technical Specification for C++ Extensions for Coroutines.pdf 537KB
p0057r0-Wording for Coroutines.pdf 522KB
p0057r3-Wording for Coroutines(Revision 3).pdf 512KB
共 104 条
- 1
- 2
资源评论
阿齐Archie
- 粉丝: 1w+
- 资源: 2301
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功