是同样的速度吗?
#define CHECK_BIT_BOOL(var,pos) ((var>>(pos)) & 1)
作为
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
目标是不使用BOOL宏,例如:
#define BOOL(x) (!(!(x)))
BOOL(CHECK_BIT(foo, 3));
这样做更好:CHECK_BIT_BOOL(foo,3);
发布于 2014-01-29 13:48:55
当前的C编译器在将典型代码转换成最好的机器语言方面非常聪明。在大多数情况下,试图超越编译器会将其混淆为生成哑代码。
现代CPU一次可以执行多个操作,无论消耗什么时间,都可能会被其他操作所掩盖,没有任何区别。CPU比内存快得多,大多数程序被内存访问速度比计算速度慢得多。
您的时间编程比通过这种微优化在运行时获得的任何收益更有价值,除非代码每天在数百万台机器上运行数千次。专注于简单、干净、明显的正确和可理解的代码。下周读的时候你会很感激的。
发布于 2014-01-29 13:36:24
如果pos
是常数,那么CHECK_BIT
可能会稍微快一些,因为没有必要在运行时执行转换。否则,两者很可能是相同的。但是,正如您所指出的,如果需要将结果限制为0或1,则需要在CHECK_BIT
之后执行更多的工作。
当然,这取决于您的目标平台,而且,如果您的性能要求非常严格,需要担心单个处理器指令的成本,那么您就必须对真实系统上的实际性能进行分析和度量。
发布于 2014-01-29 13:20:13
如果var和pos不在内存中,而是在寄存器中,则CHECK_BIT_BOOL和CHECK_BIT非常快。即使它在内存中--您无法更快地获得它(如果var为1字节,您可以创建256*8结果数组,并通过只返回结果var+ 256*8立即返回结果,但它将比执行>>和&要慢得多。)
https://stackoverflow.com/questions/21432177
复制相似问题