我正在使用玩具文件系统,我正在使用bitset
来跟踪已使用和未使用的页面。我正在使用array
个int
(以使用GCC的内置位操作)来表示bitset
。我没有使用std::bitset
,因为它在最终环境(嵌入式系统)上将不可用。
现在,根据Linux perf
,在测试过程中,分配文件占用了35%的运行时间,有45%的时间用于设置位,
#define BIT_SET(a,b) ((a) |= (1ULL<<(b)))
在循环内。根据性能,or
中有42%的时间丢失。删除要快一些,但是在and
操作中使用xor清除位切换位的操作大部分时间都没有浪费。
基本上我想知道是否有更聪明的方法可以一次性设置多个位。如果用户请求10页空间,则只需一次性设置所有位,但问题是空间可能会跨越word
个边界。或我应该知道的任何GCC / Clang语法?
答案 0 :(得分:0)
您应该能够使用这样的函数一次在一个位集中设置多个位:
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
}
如果掩码不跨越边界,则第二个字的ORd为0,因此不变。无条件地执行此操作可能比测试是否需要执行更快。如果测试显示其他情况,请在最后一行之前添加if (mask)
。