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

时间:2016-02-27 20:48:08

标签: c++ boost

阅读rationale,boost :: circular_buffer看起来很有希望:

  

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

     

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

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

  1. 写一个更大的块
  2. 读取较小的块直到空
  3. 重复
  4. 性能绝对糟糕,比我自己的hack和spsc_queue慢了4000x

    lin : 101  // 10240x
    lock: 109  // 10240x
    circ: 427  // 10x
    

    请注意,circular的循环次数为10,其他的循环次数为10*1024。请参阅工作示例here

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

    修改

    采用提供的更改的基准测试并不能完全解决MSVC2015上的问题。还有100倍的因素。

    lin : 69   // 10240x
    lock: 79   // 10240x
    circ: 9688 // 10240x 
    

    一次插入几个项目是如此之慢是有问题的。分配将在此特殊情况下起作用,因为缓冲区在插入之前已耗尽,但这不是一般解决方案。在恢复中,spsc_queue在所有方面获胜,其快速,可以在不耗尽的情况下使用,并且可以在多线程环境中使用(在单个生产者单个消费者场景中)。

1 个答案:

答案 0 :(得分:1)

首先,确保基准测试合理。如果您不使用计算结果,编译器会在您最不期望的时候将其作为死代码删除。

  1. 您的循环删除看起来不是最理想的。请改用:

    buffer.erase_begin(1024); // or indeed, use checked size see below
    
      

    <强>更新

  2. 第二件影响性能的事情 - 严重 - 是insert电话。在您的用例中,您可以使用assign,与竞争者一样,将其编译为mempcy或memmove。

  3. 确保禁用调试(定义{{​​1}}和/或NDEBUG

  4. 以下是使用Nonius的重构基准:http://paste.ubuntu.com/15222217/

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

    BOOST_CB_DISABLE_DEBUG

    互动结果:http://stackoverflow-sehe.s3.amazonaws.com/57c2bfea-3e9d-4503-8d23-3b88209fc3ce/stats.html

    enter image description here

    没有nonius: Live On Coliru

    输出

    benchmarking linear
    collecting 100 samples, 1 iterations each, in estimated 3.93727 s
    mean: 39.0804 ms, lb 39.0567 ms, ub 39.1051 ms, ci 0.95
    std dev: 124.19 μs, lb 111.153 μs, ub 141.079 μs, ci 0.95
    found 0 outliers among 100 samples (0%)
    variance is unaffected by outliers
    
    benchmarking lockfree
    collecting 100 samples, 1 iterations each, in estimated 4.78513 s
    mean: 37.0188 ms, lb 37.0106 ms, ub 37.0277 ms, ci 0.95
    std dev: 43.5788 μs, lb 37.3685 μs, ub 52.8458 μs, ci 0.95
    found 3 outliers among 100 samples (3%)
    variance is unaffected by outliers
    
    benchmarking circular
    collecting 100 samples, 1 iterations each, in estimated 9.78763 s
    mean: 62.884 ms, lb 62.8657 ms, ub 62.9041 ms, ci 0.95
    std dev: 98.0325 μs, lb 85.6543 μs, ub 119.395 μs, ci 0.95
    found 1 outliers among 100 samples (1%)
    variance is unaffected by outliers