C++ 我应该使用哪种位集实现来获得最佳性能?

C++ 我应该使用哪种位集实现来获得最佳性能?,c++,performance,compiler-construction,bitset,C++,Performance,Compiler Construction,Bitset,我目前正试图在即时(JIT)编译器中实现各种算法。许多算法在位图上运行,通常称为位集 C++中有多种实现比特集的方法。作为一个真正的C++开发人员,我更愿意使用STL中的一些东西。最重要的方面是性能。我不一定需要动态调整大小的位集 在我看来,有三种可能的选择 I.一种选择是使用std::vector,它已针对空间进行了优化。这也表明数据在内存中不必是连续的。我想这可能会降低性能。另一方面,每个bool值有一个位可以提高速度,因为它对缓存非常友好 二,。另一种选择是使用std::vector。它保

我目前正试图在即时(JIT)编译器中实现各种算法。许多算法在位图上运行,通常称为位集

C++中有多种实现比特集的方法。作为一个真正的C++开发人员,我更愿意使用STL中的一些东西。最重要的方面是性能。我不一定需要动态调整大小的位集

在我看来,有三种可能的选择

I.一种选择是使用
std::vector
,它已针对空间进行了优化。这也表明数据在内存中不必是连续的。我想这可能会降低性能。另一方面,每个bool值有一个位可以提高速度,因为它对缓存非常友好

二,。另一种选择是使用
std::vector
。它保证了数据在内存中是连续的,并且更容易访问单个元素。但是,使用此选项感觉很奇怪,因为它不是一个位集

三、 第三个选项是使用实际的
std::bitset
。它不可动态调整大小这一事实并不重要


我应该选择哪一个来获得最佳性能

最好的方法就是对其进行基准测试,因为每种情况都是不同的

我不会使用
std::vector
。我试过一次,效果很糟糕。我可以通过简单地使用
std::vector
来提高应用程序的性能

我并没有真正将
std::bitset
std::vector
进行比较,但如果您的情况下空间不是问题,我会选择
std::vector
。它使用的空间是位集的8倍,但由于它不必执行位操作来获取或设置数据,因此速度应该更快

当然,如果您需要在位集/向量中存储大量数据,那么使用位集可能是有益的,因为这将适合处理器的缓存


最简单的方法是使用typedef并隐藏实现。位集和向量都支持[]运算符,因此应该很容易将一个实现切换到另一个实现。

您可能还对这篇(有点过时)论文感兴趣:

[更新]之前的链接似乎已断开,但我认为它指向了这篇文章:

我最近在这个论坛上回答了一个类似的问题。我推荐我的朋友。我刚刚发布了1.0版。BITSCAN专门为快速位扫描操作而设计

BitBoard类为典型操作包装了许多不同的实现,如bsf、bsr或64位字(也称为bitboards)的popcount。BitBoardN、BBIntrin和BBSentinel类将位扫描扩展到位字符串。BITSCAN中的位字符串是位板数组。位字符串的基本包装类是BitBoardN。BBIntrin通过在64位板上使用Windows编译器内部函数扩展了BitBoardN。通过使用适当的asm等效函数,BBIntrin可移植到POSIX

我已经使用BITSCAN实现了一些图域中NP组合问题的有效求解器。通常,图形的邻接矩阵以及顶点集被编码为位字符串,典型的计算使用位掩码执行。中提供了简单位编码图形对象的代码。还提供了如何使用BITSCAN和GRAPH的示例

在STL(比特集)和BOOST(动态_比特集)中,比特扫描与典型实现的比较如下:

基准测试!还有一些要考虑的问题。但是说真的,如果不知道使用模式,就无法判断哪种性能最好。例如:如果您的集合很小且经常访问
vector
,则由于不必进行位移位/掩蔽,因此您可以更快地访问位集。然而,当访问频率较低/较大时,由于较大的内存占用而导致的较高的缓存未命中率可能会扼杀这一优势。冒着指出一些可能显而易见的事情的风险:std::bitset是在堆栈上分配的,因此在大多数情况下,其最大大小非常有限。然而,我不知道你需要存储多少数据。它需要多大?我的意思是,你能把它放在一个无符号的long-long或类似的东西中吗?
操作符[]
非常相似,是的,但构造函数却不一样。@MooingDuck:True。我使用typedef简化了从一种类型到另一种类型的迁移,但并不是为了让迁移变得轻松。我还在集合中使用typedef,这样我就可以隐藏真正的实现(list、vector、deque等),如果我更改容器类型,它可以将实际代码更改减少约90%。简而言之,本文的结论如下:“我们已经证明,
boost::dynamic_bitset
在执行速度方面比大多数其他实现要高效得多,而使用
std::vector
的实现在内存效率方面优于其他实现。”