我的作品ConcurrencyWriteStream,提供多线程写单线程读+多线程探测有无数据的功能,其元素不定长,可用于直接存储多类型lambda作为异步任务调度核心。
cameron似乎是目前网络上最优化的并发队列,提供了多(线程)写多读并发功能,其元素为泛型T。
tbb的concurrent_queue与其类似。
boost的并发队列各方面性能都不如tbb,因此性能数据不列出。
(以下单位均为M/s 百万次每秒)
注:new/malloc的性能大致为单线程25M/s数量级。
std::queue的性能大致为入队70M,出队670M。
基于锁的1线程写1线程读队列提供5M的出入能力,3写1读1.6M。
CPU@E3 1230v2 3.3GHz. DDR3 1600 16G.
M单位是百万次每秒 | cameron并发队列 | tbb并发队列 | CWS多写单读流 | CWS流(单线程版) | ringbuf(c语言) github星多的, 其他c++不支持多线程写入 |
---|---|---|---|---|---|
1线程入队① | 88M 令牌60M | 33.4M | 32M 令牌59M ③ | 104M(达到1亿次) | |
2线程入队 | 84.7M | 11.1M | 31.6M 令牌42.5M | 不支持 | |
4线程入队 | 80.9M | 7.3M | 32M 令牌40.3M | 不支持 | |
预插入后, 测1线程出队 | 34M | 47.62M | 120M | 130M(达到1.3亿次) | |
预插入后, 测2线程出队 | 7.0M 令牌6M | 11.1M | 不支持 | 不支持 | |
预插入后, 测4线程出队 | 3.8M 令牌4.3M | 5.1M | 不支持 | 不支持 | |
1线程入队 1线程出队 | 15M 令牌22.79M | 15.8M | 36.5M 令牌51M 单写77M 单写83M@9900kf ddr4 | 轮流入出,各127M (自产自销) | 85M 必须注册工作线程, 空间尺寸固定 |
2线程入队 1线程出队 | 34.6M 令牌49M | 不支持 | 22M | ||
3线程入队 1线程出队 | 22.5M 令牌30.5M | 19.43M | 33.4M 令牌47M | 不支持 | 12M |
7线程入队 1线程出队 (只有4线程+4超线程) | 22.62M 令牌30.55M | 22.21M | 29M 令牌40M | 不支持 | 7.7M |
注①:仅入队性能高是没有用的,最终还是要看出队性能。
注②:CPU核心数与线程数足够时,每个独立CWS流可以分别提供20~30M op/s的IO,总IO能力可以随CWS流的数量近乎线性地增长。
注③:所谓令牌指的是提高连续插入时性能的由调用者持有的辅助变量,与批量插入不同
CWS在上述对比中,可能不太突出,但是注意CWS具备不定长元素支持能力,而其他并发队列通常需要用new配合,仅就new int 和malloc(4) 而言就需要单线程每秒能支撑25M次申请(不含释放),与并发队列组合后,显然组合后性能用数学算法简单可得1(1/80M+1/25M)=19M,并且由于其糟糕的内存分布性质,内存不友好,性能必然继续下降。奇虎360的Github项目EVPP中使用的基于cameron的多生产者单消费者的异步任务队列,在其评测中提供了4M/s的调度能力(https://github.com/Qihoo360/evpp/blob/master/docs/benchmark_lockfree_vs_mutex_cn.md),而基于CWS的异步调度队列,仍然提供25M+/s的超高性能。
另外cameron具备批量插入能力,性能可达200M/s ~ 300M/s。然而CWS理论上可以插入一个大对象,然后在以单线程方式将其分割成大量小对象,这个过程是完全并行独立的。(CWS对申请4字节元素或100字节元素,性能上几乎不敏感,影响速度很小)。可以预期插入性能同样能达到10倍~20倍。但是在实际应用过程中,批量插入几乎是用不到的。
CWS多线程投递lambda, 单线程逐个执行并销毁lambda(次) | ringbuf投递字符数据(次) | ||
---|---|---|---|
1线程 | 27M | 64M | |
2线程 | 22M | 22M |
最后CWS内部数据还有在并行环境下,直接整体压缩、批量存储到文件、发送到网络的特别功能,这是其他并发队列所无法做到的。
3.3GHz cpu 实现 77Mop/s意味着45个cpu周期,13ns完成一个数据的投递。
CPU对比
E3 1230v2 3.3GHz 4核心8线程 ddr3 77M op/s
I9 9900kf 3.6GHz 8核16线程 ddr4 83M op/s
腾讯云E5-26xx v4 1核心1线程 2.39GHz 36M op/s