繁体   English   中英

即使在编译时未知该值,模运算也能以2的幂进行运算吗?

[英]Is the modulo operation faster with a power of two even if the value is not known at compile time?

在下面的代码中:

i = x % b;

b为2的幂时,即使b在编译时未知时,模运算是否更快(即,即使编译器不会将其优化为按位,并且因为它不知道b将为2的幂)? ? 如果不是,那么如果我知道b始终是2的幂,我该如何强制这种优化?

编辑:我想我在问题的第一部分真正问的是divl指令(或类似指令)本身是否会以2的幂次运行。

它是否更快显然将取决于系统。

如果您知道x为非负数,并且b为2的幂,则可以使用x & (b - 1)

在x86处理器的当前实现中, dividiv的执行时间取决于操作数,但间接取决于它们的操作数。 这实际上取决于结果的大小。 相除以使结果为0或1比相除并得到较大的结果更快(但肯定不是很快)。 确切的细节取决于微体系结构,性能差异可以更大或更小。

但这并不关心我所知道的任何实现的2的幂,并且在所有实现中,我都知道在最好的情况下,它甚至比使用按位AND还要慢至少9倍(Core2 45nm)但通常更像20,甚至比64位操作数更糟。

如果编译器知道b是2的幂,它可能会做一些事情,但这通常是为明显情况保留的,例如编译时间常数(不一定是文字)或创建为1 << n的值。 在更多情况下,编译器可以解决这个问题,或者更少。 无论如何,这里的要点是,如果知道编译器必须知道的内容,那还远远不够,而且显然这些规则是编译器特定的。

代码是否将在运行时执行优化(这是您要的),取决于编译器,但是我怀疑很多人会这样做。 如果您知道b是2 ^ n,只需编写:

i = x & ((1 << n) - 1);

并且您将始终获得优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM