1

作为项目的一部分,我需要在一个大循环内进行掩码计算(大约 10^6 到 10^7 次重复)。我需要保留任意数量的最低有效位(1-8),或特定位置的任何位(7-0,其中 7 是最高有效位)。为了不在主代码中计算 Masks - 并且为了性能,我提出了以下想法(在每种情况下,参数都是从 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 个时钟周期用于位置。

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

谢谢你的时间!

4

2 回答 2

1

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

于 2013-07-16T11:17:40.893 回答
1

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

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

于 2013-07-16T11:18:26.647 回答