预先计算性能的面具

时间:2013-07-16 11:12:03

标签: c performance bitwise-operators

作为项目的一部分,我需要在一个大循环中进行掩码计算(大约10 ^ 6到10 ^ 7次重复)。我需要保留任意数量的最低有效位(1-8),或任何位在特定位置(7-0,其中7是最高有效位)。为了不计算主代码中的掩码 - 为了提高性能,我提出了以下想法(在每种情况下,参数都是从0到7的无符号字符):

1)使用头文件中定义的两个全局数组(比如bitops.h):

char mask[8] = {1, 3, 7, 15, 31, 63, 127, 255};
char position[8] = {1, 2, 4, 8, 16, 32, 64, 128};

由于内存延迟,我们可能不得不等待。

2)使用简单的操作(通过宏)计算掩模:

#define mask(x) ((1 << (x + 1)) - 1)
#define position(x) (1 << x)

我们需要大约3个时钟周期用于掩码,只有1个用于位置。

你有什么建议?第二个选项实际上是否更快,或者如果我选择第一个选项,处理器是否会提前缓存常量?

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

你应该对此进行基准测试以确定是否存在显着差异,但一般来说,经验法则是对于简单的计算(例如几个周期),最好是即时进行计算,而对于复杂的计算(循环10次或更多)查找表可能更有效。在这种情况下,直接计算似乎是可行的方法,但除非您进行基准测试,否则还有许多其他因素需要考虑,您无法确定。

答案 1 :(得分:1)

我希望第一个更好,因为数组应该总是在缓存中。如果你想确定,你应该对它进行基准测试。

但是,除非你确定这个循环是一个瓶颈,否则不要浪费你的时间来担心这个问题。首先以最明确的方式做,如果性能是一个问题,那么担心重新设计它。