我正在开发一个玩具文件系统,我正在使用bitset
来跟踪已使用和未使用的页面。我正在使用array
的int
s(为了使用GCC的内置位操作。)来代表bitset
。我没有使用std::bitset
,因为它不适用于最终环境(嵌入式系统)。
现在根据Linux perf
在测试期间分配文件需要35%的运行时间,45%的时间丢失设置位使用,
#define BIT_SET(a,b) ((a) |= (1ULL<<(b)))
在循环内。根据穿孔42%的时间在or
丢失。删除有点快,但是大多数时间在and
操作中丢失,以清除使用xor切换位的位没有任何区别。
基本上我想知道是否有更智能的方法可以一次设置多个位。如果用户请求10页空间只需将所有位一次性设置,但问题是空间可以跨越word
边界。或者我应该注意的任何GCC / Clang教义?
您应该能够使用这样的函数一次在位集中设置多个位:
void set_mask(word_t* bitset, word_t mask, int lowbit) {
int index= lowbit / sizeof(word_t);
int offset = lowbit % sizeof(word_t);
bitset[index] |= (mask << offset);
mask >>= (sizeof(word_t) - offset);
bitset[index+1] |= mask
}
如果掩码没有跨越边界,则第二个字是0,因此它保持不变。无条件地执行此操作可能比测试更快,以确定是否需要完成。如果测试另有说明,请在最后一行之前添加if (mask)
。