【问题标题】:Is bitset faster than an array of bools?bitset 比 bool 数组快吗?
【发布时间】:2016-08-07 09:04:13
【问题描述】:

C++ 提供bitset 来存储位。根据参考,该类模拟bool 元素的数组,但针对空间分配进行了优化。在哪些情况下,应该优先选择一个?

【问题讨论】:

  • 为什么不写一些代码来获取性能统计数据?
  • 好问题。您应该使用这两种实现来衡量您的问题。
  • @juanchopanza:你是对的,问题应该是:我什么时候应该更喜欢其中一个。我会编辑
  • @AmiTavory:这是一个普遍的问题。我今天听说了这个我不知道的课程,我想扩展我的工具箱。如果一种实现与另一种有很大不同,我想知道。

标签: c++


【解决方案1】:

正确的做法是进行测量。

不过,我记得,关于位集的文档总是说位集不能保证是真正的位,它只是对编译器的建议和位操作的方便语法。

在嵌入式系统编译器中,许多人使用真正的位集,因为在此类程序中使用位是真正的必要条件。

至于速度,相反的情况更合理——通过索引使用数组更简单。使用位需要更多的数学运算,才能访问正确的字,然后访问正确的位。

【讨论】:

  • 虽然“位移意味着额外的工作,所以它必须更慢!”听起来很合理,在实践中,额外的成本是两个额外的班次和两个和(最多)。这在现代 CPU 上大约是 2 个周期。但是您只是将内存压力增加了八倍,这可能会对性能产生更多更大的影响。所以到目前为止还没有那么明确。
【解决方案2】:

我有同样的问题,所以我做了一个搜索序列的基准。因为 bitset 没有迭代器,所以我不得不为 bitset 创建一个“std::search”替代方案。

c-lang 8.0 结果:

64 bits => bitset 1.2 times slower than array
128 bits => bitset 1.4 times slower than array
1024 bits => bitset 1.5 times slower than array
4096 bits => bitset 1.5 times slower than array

gcc 9.1 结果:

64 bits => bitset 1.6 times faster than array
128 bits => bitset 1.5 times faster than array
1024 bits => bitset 1.4 times faster than array
4096 bits => bitset 1.4 times faster than array

总的意外结果。

基准测试可以在这里运行http://quick-bench.com/-er6qDrx0dPmJ0rGnJ9t3EpLoMM

2020-09 年更新

使用 Clang 10.0 和 GCC 10.1,在这两种情况下,bool 数组都比 bitset 快

【讨论】:

    【解决方案3】:

    您需要对您的用例进行基准测试。

    • bitset<N> 的传统实现是使用每元素位和array<bool, N> -- 每元素字节,因此前者具有更高的更改以适应 L1d..LLd,因此对于临界大小可能更快位掩码,至少在执行串行访问时
    • bitset<N> 做了更多的数学运算,因此在某些访问模式(高度随机)下可能会更慢
    • 同时访问时,array<bool, N> 每个元素的争用会更少,因此性能很大程度上取决于访问模式。

    追加2020.09

    我经常直接使用uint64_t-s 和编译器内在函数来扫描/计数。 它击败了 OP 就可以使用它的用例询问的两种替代方案(好吧,用于跟踪多达 64 个东西)。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 2012-07-22
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多