编辑:在C ++中 如果我有,我需要测试8个标志。哪个在处理速度方面更有效:
在单个if语句中检查8个bool变量,或者使用表示标志的char,每个标志使用1位并在单个if语句中使用单个按位运算?
如果我有一个标志要测试,那会有所作为吗?
答案 0 :(得分:5)
如果您要检查所有位的已知值,那么比较char
可能会更快:
if (bitval == 0x82) ...
如果你想检查某些位,忽略其他位,可能可以更快地将“位”保存在单独的变量中:
if ((bitval7 == 1) && (bitval1 == 1)) ...
或者简单地掩盖你不关心的位可能会更快:
if ((bitval & 0x82) == 0x82) ...
如果您真的担心,可以选择以两种方式存储它们(前提是保持它们同步)并根据您感兴趣的位数选择。
但我认为这种严重的矫枉过正,因为,老实说,速度差异很小,可能是无关紧要的。
如果您要进行优化,您几乎总能获得更好的投资回报,例如算法选择等宏观优势,而不是微观优化,例如分离布尔值或改变循环方向。
不要误解我的意思,这些微观优化可以在某些情况下发挥作用,但它们通常不是最佳方式。
答案 1 :(得分:1)
这个问题实际上归结为编译器。这取决于它如何引用要检查的位,但是,我相信可以肯定地说,只要您检查多个位,char就会更快。
通过char运行所需的时钟周期数明显短于单个变量,因为标志在内存中相邻堆叠,从而消除了内存寻址的要求。
如果你想要明显的速度差异,除非你改变你的检查方法,否则你不会得到它。
答案 2 :(得分:1)
我通常是按位标志的粉丝,但我发现拥有一些支持功能通常很有用:
inline bool TestAll( char flags, char value ) {
return (flags & value) == value;
}
inline bool TestAny( char flags, char value ) {
return (flags & value) != 0;
}
inline bool TestAllExclusive( char flags, char value ) {
return flags == value;
}
inline bool TestAnyExclusive( char flags, char value ) {
return (flags & value) != 0 && (flags & ~value) == 0;
}
你也可以做类似的功能来拍摄旗帜面具,让所有神奇的东西更容易阅读。
如果您有测试的真值,那么就速度而言,这是一个胜利者,因为您只是处理常数。
typedef enum EmotiveFlags {
E_ELATED = 0x01,
E_JOYOUS = 0x02,
E_NONPLUSED = 0x04,
E_BEWILDERED = 0x08,
E_ANNOYED = 0x10,
E_PUZZLED = 0x20,
E_ENRAGED = 0x40,
E_AMUSED = 0x80
} EEmotiveFlags;
if( TestAny(flags, E_JOYOUS | E_ELATED | E_AMUSED) ) {
//...
}
else if( TestAll(flags, E_ANNOYED | E_ENRAGED) && !TestAll(flags, E_AMUSED) ) {
//...
}
答案 3 :(得分:0)
嗯,最好的选择是将代码编译成汇编程序并检查它。
8个bool标志需要8个寄存器。这很多。 8位标志只需要一个寄存器。如果将所有标志放在一个寄存器中,则测试速度非常快。