为什么 boost::circular_buffer 在我的基准测试中这么慢?

Tho*_*mas 5 c++ boost

阅读基本原理, boost::circular_buffer 看起来很有希望:

适用于实时和性能关键应用程序。

从正面和背面快速恒定时间插入和移除元素。

当我运行一个简单的基准测试来模拟我的用例时,将其用作字节缓冲区:

  1. 写一个更大的块
  2. 读取较小的块直到为空
  3. 重复

性能绝对糟糕透顶,比我自己的 hack 和 spsc_queue 慢 4000 多倍。

lin : 101  // 10240x
lock: 109  // 10240x
circ: 427  // 10x
Run Code Online (Sandbox Code Playgroud)

注意,对于loopcountcircular10和loopcount为别人10*1024。请参阅此处的工作示例。

我使用它是完全错误的还是它只是没有考虑基本/ POD 类型?

编辑:

采用具有所提供更改的基准并不能完全解决 MSVC2015 上的问题。仍然有 100 倍的系数。

lin : 69   // 10240x
lock: 79   // 10240x
circ: 9688 // 10240x 
Run Code Online (Sandbox Code Playgroud)

一次插入多个项目如此缓慢是有问题的。分配在这种特殊情况下会起作用,因为在插入之前缓冲区已耗尽,但这不是通用解决方案。在resume spsc_queue各方面都胜出,它的速度快,可以不消耗,可以用在多线程环境中(单生产者单消费者场景)。

seh*_*ehe 2

首先,确保基准是合理的。如果您不使用计算结果,编译器将在您最意想不到的时候将其作为死代码消除。

\n
    \n
  1. 您的循环删除看起来不太理想。使用这个代替:

    \n
    buffer.erase_begin(1024); // or indeed, use checked size see below\n
    Run Code Online (Sandbox Code Playgroud)\n
    \n

    更新

    \n
    \n
  2. \n
  3. 第二件严重影响绩效的事情是电话insert。在您的用例中,您可以使用assign它,就像在竞争者中一样,被编译为 memcpy 或 memmove。

    \n
  4. \n
  5. 确保禁用调试(定义NDEBUG和 或BOOST_CB_DISABLE_DEBUG

    \n
  6. \n
\n

这是我使用Nonius重构的基准:http://paste.ubuntu.com/15222217/

\n

时钟分辨率:平均值为 18.6412 ns(40960002 次迭代)

\n
benchmarking 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\n
Run 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

输出

\n
lin : 101 (checksum: -1741910392)\nlock: 89 (checksum: -1741910392)\ncirc: 102 (checksum: -1741910392)\n
Run Code Online (Sandbox Code Playgroud)\n