【发布时间】:2012-10-15 21:20:08
【问题描述】:
由于 C 的位运算符 &、| 和 ~ 通常也是汇编语言操作码,因此位掩码代码原则上应该非常快。
对于如何在模拟算法的内部循环中添加位掩码,我有一些选择。本质上,它归结为是使用一组预先封装好的掩码,还是使用左移和右移动态更改掩码。
是否有特殊的技巧/技术可以使位掩码尽可能避免不必要的开销?从效率的角度来看,以下三种方法中的任何一种是特别好还是坏?
-
选项 1:循环遍历一组预装掩码,例如挑选特定的位
unsigned char mask[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1}; for(i=0;i<8;i++) { ... (mask[i] & mem_data ) ...}
-
选项 2:在每次循环迭代中向下移动多个位置
unsigned char mask=0x80; for(i=0;i<8;i++) { ... mem_data & (mask>>i) ... } -
选项 3:在每次循环迭代中精确地向下移动一个位置
unsigned char mask=0x80; while(mask) { ... mem_data & mask mask>>=1; ... }
编辑: 从示例中删除了 putchar(),以免分散问题的注意力
【问题讨论】:
-
我认为对于其中任何一个,
putchar的价格会贵几个(至少 3-4 个)数量级,所以我不用担心。 -
只需对其进行分析并找出答案。如果编译器为每一个生成非常相似的代码,我实际上不会太惊讶。
-
那么...您给我们代码并希望我们为您分析它?
-
一个很好的问题应该是“选项 x 比选项 y 快,这是为什么呢?” (怀疑)
-
速度完全不重要。对于大多数通用处理器,所有算术/逻辑/按位运算都同样快。 (这对于嵌入式的东西可能有点不同)在 x86 上,如果它可以与总线和缓存流量并行执行,则该操作将不会花费任何周期。将花费循环的是分支(循环一两个,位条件一两个),这将破坏分支预测并耗尽前瞻。第一个 (LUT) 示例具有浪费缓存槽的额外缺点(但它可以甚至被优化掉)。 YMMV。措施。算了。
标签: c assembly bit-manipulation performance