基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 5.3KB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # librf 2.9.10
  2. ### librf - 协程库
  3. * librf是一个基于C++20 coroutines编写的无栈协程库。
  4. 支持以下平台和编译器:
  5. Windows: 使用VS2017/VS2019编译(clang在兼容msvc模式下不支持异常,不再支持clang)
  6. Android: 使用NDK 20.1 自带的clang编译
  7. Mac: 使用XCode 11.2.1 自带的apple-clang编译
  8. Ubuntu: 使用GCC 11.2/clang 14 编译(2020-04-18:mutex ranged lock failed)
  9. 注意:GCC 10.0.1在C++ Coroutines上依然存在很多BUG。
  10. 当前阶段不推荐使用GCC(version 11.2以下)。
  11. <br>
  12. * 性能测试
  13. ​ 本来无意搞性能测试的,因为librf的初衷和设计目标,就不是为了性能。然而,随着C++ Coroutines进入C++ 20标准,类似的协程库也越来越多。得益于C++ Coroutines的优良设计,他们的这些协程库都把性能放在首要位置进行宣传。裹挟着我也不得不进行一番性能调优,以及测试。
  14. 以下数据全是平局每个操作的时间开销。
  15. | 编译器 | 操作系统 | [mimalloc](https://github.com/microsoft/mimalloc) | 多线程 | 创建*1 | 切换*1 | 创建*1000 | 切换*1000 | 创建*30000 | 切换*30000 |
  16. | :----: | :----------- | :-----------------------------------------------: | :----: | :----: | :----: | :-------: | :-------: | :--------: | :--------: |
  17. | clang | Windows10 | ON | OFF | 500 ns | 17 ns | 101 ns | **11 ns** | 90 ns | 12 ns |
  18. | clang | Windows10 | **ON** | **ON** | 500 ns | 37 ns | 116 ns | **18 ns** | 103 ns | 20 ns |
  19. | clang | Windows10 | OFF | OFF | 800 ns | 16 ns | 208 ns | **11 ns** | 186 ns | 15 ns |
  20. | clang | Windows10 | OFF | ON | 900 ns | 37 ns | 240 ns | **18 ns** | 203 ns | 23 ns |
  21. | clang | Ubuntu 20.04 | ON | OFF | 400 ns | 15 ns | 112 ns | **11 ns** | 108 ns | 12 ns |
  22. | clang | Ubuntu 20.04 | **ON** | **ON** | 500 ns | 31 ns | 111 ns | **16 ns** | 109 ns | 17 ns |
  23. | clang | Ubuntu 20.04 | OFF | OFF | 400 ns | 15 ns | 133 ns | **13 ns** | 149 ns | 15 ns |
  24. | clang | Ubuntu 20.04 | OFF | ON | 500 ns | 30 ns | 140 ns | **17 ns** | 141 ns | 19 ns |
  25. (测试环境:I7 8700K OC 4.3GHz,频率由于酷睿原因不是特别稳定)
  26. 多线程:调度器是否开启多线程支持。由于调度器里频繁用到自旋锁,导致在这种测试中数据较为难看。
  27. 创建*1:创建 1 个协程的平均开销;
  28. 切换*1:在只有 1 个协程的时候,切换 3000000 次的平均开销;
  29. 创建*1000:创建 1000 个协程的平均开销;
  30. 切换*1000:在具有 1000 个协程的时候,切换 3000000 次的平均开销;
  31. 创建*30000:创建 30000 个协程的平均开销;
  32. 切换*30000:在具有 30000 个协程的时候,切换 3000000 次的平均开销;
  33. 加粗的字,表示那一项应该是常规状态下的状态,具有较大参考价值。
  34. <br>
  35. * librf有以下特点:
  36. ```
  37. 1.基于C++20提案'Stackless Resumable Functions'编写的非对称stackless协程库,可以以同步的方式编写简单的代码,同时获得异步的性能
  38. 2.理论上支持海量协程, 创建 **10,000,000** 个协程只需使用 **2.2G** 物理内存(使用clang编译)
  39. 3.拥有极小的协程调度开销,在I7 8100 3.6GHz的CPU上,**1000** 个协程的平均切换开销是 **27** 纳秒(使用clang编译)
  40. 4.提供协程锁(mutex), 定时器, channel, event等特性, 帮助用户更加容易地编写程序
  41. 5.可以很好的跟asio, libuv等库结合,能跟现有的callback范式的异步/延迟代码很好的结合
  42. 6.目前已处于较为完善状态,已经小规模在生产项目中使用。不出意外,2.8以上版本就是C++20 Coroutines对应的版本
  43. ```
  44. <br>
  45. * 如果你发现了任何bug、有好的建议、或使用上有不明之处,可以提交到issue,也可以直接联系作者:
  46. email: tearshark@163.net
  47. QQ交流群: 296561497
  48. <br>
  49. * 更新日志:
  50. 2020-06-20 更新:
  51. ```
  52. 性能调优和测试数据
  53. ```
  54. 2020-03-31 更新:
  55. 使用Doxygen自动生成文档,并完善文档内容。
  56. 支持cmake。(目前仅VS2019测试通过)。
  57. 2020-03-26 更新:
  58. 兼容xcode 11.2.1。
  59. 2020-03-18 更新:
  60. 更新event/mutex/when_all/when_any实现。至此,2.x版本完整恢复1.x版本的所有功能。
  61. 版本号提升至 2.8.0。
  62. 3.0之前,只打算做修复BUG相关的工作。
  63. 3.0的目标,是根据executor的设计,重写scheduler代码。
  64. 2020-03-08 更新:
  65. 更新channel实现,效率提高了近三倍。
  66. channel的新的实现方法,为event/mutex指明了新的修改方向。
  67. 2020-02-16 更新:
  68. 更新调度器算法,深入应用Coroutines的特性,以期获得更高调度性能。
  69. 不再支持C++14。
  70. * 注一:doc目录下有作者搜集的一些关于C++协程的资料
  71. * 注二:tutorial目录下有针对每个特性的范例代码,让用户可以循序渐进的了解librf库的特性