阅读基本原理, boost::circular_buffer 看起来很有希望:
适用于实时和性能关键应用程序。
从正面和背面快速恒定时间插入和移除元素。
当我运行一个简单的基准测试来模拟我的用例时,将其用作字节缓冲区:
性能绝对糟糕透顶,比我自己的 hack 和 spsc_queue 慢 4000 多倍。
lin : 101 // 10240x
lock: 109 // 10240x
circ: 427 // 10x
Run Code Online (Sandbox Code Playgroud)
注意,对于loopcountcircular是10和loopcount为别人10*1024。请参阅此处的工作示例。
我使用它是完全错误的还是它只是没有考虑基本/ POD 类型?
编辑:
采用具有所提供更改的基准并不能完全解决 MSVC2015 上的问题。仍然有 100 倍的系数。
lin : 69 // 10240x
lock: 79 // 10240x
circ: 9688 // 10240x
Run Code Online (Sandbox Code Playgroud)
一次插入多个项目如此缓慢是有问题的。分配在这种特殊情况下会起作用,因为在插入之前缓冲区已耗尽,但这不是通用解决方案。在resume spsc_queue各方面都胜出,它的速度快,可以不消耗,可以用在多线程环境中(单生产者单消费者场景)。
首先,确保基准是合理的。如果您不使用计算结果,编译器将在您最意想不到的时候将其作为死代码消除。
\n您的循环删除看起来不太理想。使用这个代替:
\nbuffer.erase_begin(1024); // or indeed, use checked size see below\nRun Code Online (Sandbox Code Playgroud)\n\n\n更新
\n
第二件严重影响绩效的事情是电话insert。在您的用例中,您可以使用assign它,就像在竞争者中一样,被编译为 memcpy 或 memmove。
确保禁用调试(定义NDEBUG和 或BOOST_CB_DISABLE_DEBUG)
这是我使用Nonius重构的基准:http://paste.ubuntu.com/15222217/
\n时钟分辨率:平均值为 18.6412 ns(40960002 次迭代)
\nbenchmarking linear\ncollecting 100 samples, 1 iterations each, in estimated 3.93727 s\nmean: 39.0804 ms, lb 39.0567 ms, ub 39.1051 ms, ci 0.95\nstd dev: 124.19 \xce\xbcs, lb 111.153 \xce\xbcs, ub 141.079 \xce\xbcs, ci 0.95\nfound 0 outliers among 100 samples (0%)\nvariance is unaffected by outliers\n\nbenchmarking lockfree\ncollecting 100 samples, 1 iterations each, in estimated 4.78513 s\nmean: 37.0188 ms, lb 37.0106 ms, ub 37.0277 ms, ci 0.95\nstd dev: 43.5788 \xce\xbcs, lb 37.3685 \xce\xbcs, ub 52.8458 \xce\xbcs, ci 0.95\nfound 3 outliers among 100 samples (3%)\nvariance is unaffected by outliers\n\nbenchmarking circular\ncollecting 100 samples, 1 iterations each, in estimated 9.78763 s\nmean: 62.884 ms, lb 62.8657 ms, ub 62.9041 ms, ci 0.95\nstd dev: 98.0325 \xce\xbcs, lb 85.6543 \xce\xbcs, ub 119.395 \xce\xbcs, ci 0.95\nfound 1 outliers among 100 samples (1%)\nvariance is unaffected by outliers\nRun Code Online (Sandbox Code Playgroud)\n交互式结果:http://stackoverflow-sehe.s3.amazonaws.com/57c2bfea-3e9d-4503-8d23-3b88209fc3ce/stats.html
\n\n没有游标:Live On Coliru
\n输出
\nlin : 101 (checksum: -1741910392)\nlock: 89 (checksum: -1741910392)\ncirc: 102 (checksum: -1741910392)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |