- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
阅读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.
当我运行一个模拟我的用例的简单基准测试时,将其用作字节缓冲区:
性能绝对糟糕,超过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是全胜,速度快,可以不耗尽使用,可以在多线程环境下使用(单生产者单消费者场景)。
最佳答案
首先,确保基准是可靠的。如果您不使用计算结果,编译器会在您最意想不到的时候将其作为死代码消除。
您的循环删除看起来不太理想。改用这个:
buffer.erase_begin(1024); // or indeed, use checked size see below
UPDATE
第二个严重影响性能的是 insert
调用。在您的用例中,您可以使用 assign
,就像在竞争者中一样,它被编译成 mempcy 或 memmove。
确保调试已禁用(定义 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
没有 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/
我是cpp的新手。我想把“boost::circular_buffer histpos(5);”用 5 个空格将 5 个元素存储在 cpp 结构中作为成员。 我试试这个: typedef struct
我有 2 个进程:一个生产者和“消费者”,它们仍然在缓冲区中保留值,它们将被覆盖。 但是让消费者跟踪会带来一些问题。当缓冲区已满并且值被覆盖时,指向索引 0 的值是刚被覆盖的值之前的值(即下一个最旧的
我需要在处理到达进程 X 的对象之前对它们进行排序。 对象根据时间戳进行排序 - 一个 64 位数字。 当对象超时(几毫)并排序时,进程 X 开始查看它们。 大多数情况下,对象到达时是有序的,有 3%
我正在寻找一个允许在磁盘上获取循环缓冲区的库。 在 Boost 中有类似的东西,但它是一个基于内存的容器:circular_buffer . 最佳答案 你可以随意调用它。 您正在寻找内存映射文件。 使
以下编译失败: auto myCircularBuffer = boost::circular_buffer{1,2,3,4}; 有错误: `error: no matching function f
我在 MAC (xcode) 中使用 boost 库。我有两个关于 boost::circular_buffer 的问题。 1 - 声明 circular_buffer 时出现语法错误 boost::
是否强制存储std::shared_ptr在 boost::circular_buffer 中?如果我有 boost::circular_buffer循环队列delete是第n+1次插入后自动弹出的元
我正在使用 boost 1.73.0,并尝试将循环缓冲区与 manage_mapped_file 一起使用以将字符串存储在磁盘上持久的循环缓冲区中。 我执行以下操作来创建/打开循环缓冲区: boost
我面临以下情况(我不得不承认我太菜鸟了,不相信自己可以单独解决..):我有线程 A,它偶尔会创建新的 cv::Mat 对象供线程 B 使用。我需要一个线程安全的容器 C(在本例中为 boost::ci
阅读rationale , boost::circular_buffer 看起来很有希望: Suitability for real-time and performance critical app
我正在实现 boost::circular_buffer在boost::managed_shared_memory .我使用示例代码演示共享内存中的 vector here .我做了以下更改: 1)
我发现 Boost 实现了 KMP 算法,我想将它与 circular_buffer 一起使用,但我无法将其与组件相匹配。任何有 boost 经验的人都可以告诉我如何做到这一点。 最佳答案 您遇到了什
我想用 unique_ptrs 填充 boost::circular_buffer 但我在公共(public)接口(interface)中的任何函数中找不到任何“emplace”函数或任何 && 参数
我正尝试在我的代码中使用 boost::circular_buffer,如下所示: class EventRegistry { public: EventRegistry() {
我今天早些时候发现,boost::circular 缓冲区的迭代器在多线程环境中的表现并不像我预期的那样。 (尽管公平地说,它们的行为也与我在单线程程序中的想法不同)。 如果您调用 buffer.be
这段简单的代码将 2 个 bool 添加到循环缓冲区。 boost::circular_buffer stuff; stuff.push_back(false); stuff.push_back(tr
我使用 std::vector 编写了很多代码和 std::vector::iterator .现在我决定用 boost 的循环缓冲区替换 vector 容器,即 boost::circular_bu
我是一名优秀的程序员,十分优秀!