作为项目的一部分,我需要在一个大循环中进行掩码计算(大约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个用于位置。
你有什么建议?第二个选项实际上是否更快,或者如果我选择第一个选项,处理器是否会提前缓存常量?
谢谢你的时间!
答案 0 :(得分:1)
你应该对此进行基准测试以确定是否存在显着差异,但一般来说,经验法则是对于简单的计算(例如几个周期),最好是即时进行计算,而对于复杂的计算(循环10次或更多)查找表可能更有效。在这种情况下,直接计算似乎是可行的方法,但除非您进行基准测试,否则还有许多其他因素需要考虑,您无法确定。
答案 1 :(得分:1)
我希望第一个更好,因为数组应该总是在缓存中。如果你想确定,你应该对它进行基准测试。
但是,除非你确定这个循环是一个瓶颈,否则不要浪费你的时间来担心这个问题。首先以最明确的方式做,如果性能是一个问题,那么担心重新设计它。