c++ - 如何提高C++ STL位集效率?

标签 c++ performance stl bitset lookup-tables

我有一个程序大量使用STL的bitset。 gperftools 显示性能瓶颈之一是 std::_Base_bitset::_S_maskbit (内联)。

从这里开始https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a00775_source.html#l00078似乎总是重新计算用于访问或修改位集的掩码。这让我想知道查找表是否有帮助。

我尝试实现我自己的 bitset 版本,其中使用了掩码查找表。然而,由于我的版本没有使用像__builtin_memcpy这样的gcc内置指令,它实际上比STL bitset慢得多。

所以我想知道是否有办法替换std::_Base_bitset::_S_maskbit,或者我应该通过复制STL的代码来编写自己的bitset版本bitset 并添加查找表。

谢谢!

最佳答案

如果您的位集足够小,请使用 std::vector<char>可以是一个改进。当然,您使用了 8 倍的内存,但您不再需要计算掩码,并且分析显示这与您相关。

由于 x86 对寻址模式和预取器的良好支持,访问数组的速度相当快,但位集更多的是 ARM 的领域,其中许多操作可以包含自由位移。

关于c++ - 如何提高C++ STL位集效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26154391/

相关文章:

c++ - 获取 vector c++中的字符串计数

c++ - 为什么我每次使用 mingw gcc4.8.1 运行 std::random_device 都会得到相同的序列?

performance - MATLAB 识别 3D 图像中的相邻区域

c++ - 线程安全 vector 实现

c++ - 2 种模板相关类型名称的区别

c++ - 使用 OpenCV 将 RGB 图像转换为二值图像

c++ - 一种通过 ID 访问并查找加权随机项的高效数据结构

javascript - 使用大量内容可编辑 div 时 Angular 6/Ionic 4 PWA 性能下降

c++ - Boost 消息队列可以处理的最大大小?

c++ - 为什么 C++ 为我的动态数组分配如此大的内存空间?