gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:02 44 4
gpt4 key购买 nike

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

Suitability for real-time and performance critical applications.

Fast constant-time insertion and removal of elements from the front and back.

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

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

性能绝对糟糕,超过4000x比我自己的 hack 和 spsc_queue 慢。

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

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

最佳答案

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

  1. 您的循环删除看起来不太理想。改用这个:

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

    UPDATE

  2. 第二个严重影响性能的是 insert 调用。在您的用例中,您可以使用 assign,就像在竞争者中一样,它被编译成 mempcy 或 memmove。

  3. 确保调试已禁用(定义 NDEBUG 和/或 BOOST_CB_DISABLE_DEBUG)

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

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

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

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

enter image description here

没有 nonius: Live On Coliru

输出

lin : 101 (checksum: -1741910392)
lock: 89 (checksum: -1741910392)
circ: 102 (checksum: -1741910392)

关于c++ - 为什么 boost::circular_buffer 在我的基准测试中这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675261/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com