比较&的速度vs C ++中的%

时间:2015-01-26 23:16:17

标签: c++ performance modulo micro-optimization bitwise-and

在C ++命令中是否正确

n& 1

更快,占用的内存少于

n%2?

(其中n的类型为int)

更全局,有没有办法比使用%运算符更快地找到模2的整数残差?提前谢谢。

1 个答案:

答案 0 :(得分:5)

使用更多或更少的内存高度依赖于指令编码,但n & 1可以快许多倍[1],如果编译器没有优化n % 2同样的事情。当然,许多编译器确实会进行这种优化(或者可以做同样的事情,但应对对%产生有趣影响的负数,&不需要“关心”关于)。

请注意,根据您想要实现的目标,负数将需要特殊处理才能使用& 1。如果从1获取-1 & 1是正常的,那么使用&确实是一个有效选项,但在数学上有点奇怪。

另请注意,总是在比较性能时,您需要进行自己的基准测量[或者很好地理解特定编译器为特定处理器模型生成的内容],您不能总是依赖于您在互联网上阅读的内容 - 包括我的帖子。

[1]作为比较,大多数现代处理器在单个时钟周期内执行AND,并且通常可以并行执行多个这样的操作。用于余数的整数除法肯定不是那么快。我碰巧从2012年1月开始为“家庭15”处理器提供AMD优化指南。采用“余数”作为答案的32位除法运算最多可能需要39个时钟周期。因此,假设编译器没有将%优化为AND指令,使用%比使用&差大约40-80倍 - 当然假设它是有效的优化。