我目前正在评估是否应该使用单个大型位集或多个 64 位无符号长整数 (uint_64) 来存储大量位图信息。在这种情况下,位图表示几 GB 内存页面的当前状态(脏/非脏),并且有数千个条目。
我正在执行的工作要求我能够查询和更新脏页,包括在两个脏页位图之间执行 OR 操作。
为了清楚起见,我将执行以下操作:
- 从文件导入位图,并与现有位图执行按位或运算
- 计算汉明权重(计算设置为 1 的位数,表示脏页数)
- 重置/清除一点,将其标记为更新/清理
- 检查位的当前状态,以确定它是否干净
看起来对 C++ 位集执行按位运算很容易,并且很容易计算汉明权重。但是,我想这里没有魔法——CPU 只能对它可以存储在寄存器中的尽可能多的字节执行按位操作——所以 bitset 使用的例程可能与我自己实现的例程相同。汉明权重可能也是如此。
此外,将位图数据从文件导入位集看起来很难看——我需要多次执行位移,如此处所示。我想考虑到我将使用的位集的大小,这会对性能产生负面影响。当然,我想我可以只使用许多小的位集,但这可能没有任何优势(其他可能易于实现)。
一如既往,任何建议都会被采纳。谢谢!