【发布时间】:2012-07-27 14:07:31
【问题描述】:
我目前正在尝试在即时 (JIT) 编译器中实现各种算法。许多算法都在位图上运行,通常称为位集。
在 C++ 中有多种实现位集的方法。作为一个真正的 C++ 开发人员,我更喜欢使用来自 STL 的东西。最重要的方面是性能。我不一定需要动态调整大小的位集。
在我看来,有三种可能的选择。
我。一种选择是使用std::vector<bool>,它已针对空间进行了优化。这也表明数据在内存中不必是连续的。我想这可能会降低性能。另一方面,每个布尔值都有一个位可以提高速度,因为它对缓存非常友好。
二。另一种选择是改用std::vector<char>。它保证数据在内存中是连续的,并且更容易访问单个元素。然而,使用这个选项感觉很奇怪,因为它不是一个位集。
三。第三个选项是使用实际的std::bitset。它不是动态调整大小的事实并不重要。
我应该选择哪一个以获得最佳性能?
【问题讨论】:
-
基准测试! Related.
-
还有Boost.Dynamic Bitset 需要考虑。但说真的,在不知道使用模式的情况下,真的没有办法判断哪种性能的性能最好。例如:如果您的集合很小并且经常访问
vector<char>可能会比位集更快地访问,因为不必进行位移/屏蔽。然而,当访问频率较低/较大时,由于更大的内存占用而导致的高速缓存未命中数量可能会扼杀这种好处。 -
冒着指出一些可能显而易见的风险:std::bitset 是在堆栈上分配的,因此在大多数情况下,最大大小非常有限。但是,我对您需要存储的数据量一无所知。
-
它需要多大?我的意思是,你能把它放在一个 unsigned long long 或类似的东西里吗?
标签: c++ performance compiler-construction bitset