【问题标题】:Comparing speed of & vs % in C++ [duplicate]比较 C++ 中 & 与 % 的速度 [重复]
【发布时间】:2015-01-26 23:16:16
【问题描述】:

在C++命令中是不是真的

n & 1

更快,使用更少的内存

n % 2?

(其中 n 是 int 类型)

在全球范围内,有什么方法可以比使用 % 运算符更快地找到整数模 2 的余数?提前致谢。

【问题讨论】:

  • 你确定你的编译器还没有把第二个翻译成第一个吗?
  • 为什么你认为模运算对你来说不够快?
  • 对于有符号整数,这两个表达式不等价 - 也许您正在考虑无符号整数?
  • @moodboom。它当然足够快 - 我只是感兴趣。
  • @gha.st:Javascript 和 C++ 之间的规则是否相同是非常值得怀疑的——Javascript 甚至没有静态类型。它可能是重复的,但不是那个问题。

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


【解决方案1】:

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

请注意,根据您想要实现的具体目标,负数需要在使用& 1 之前进行特殊处理。如果从-1 & 1 得到1 没问题,那么使用& 确实是一个有效的选择,但在数学上有点奇怪。

还请注意,在比较性能时,您始终需要进行自己的基准测试 [或非常了解特定编译器为特定处理器型号生成的内容],您不能总是依赖您在互联网上阅读的内容- 包括我的帖子。

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

【讨论】:

  • @PaulR:就像我在回答中所说的那样“负数在% 中变得‘有趣’”。至少当您使用带有 2^n 值的 % 时,gcc 确实会执行 AND 指令 - 但它会在有符号数上执行一些额外的指令,从而使优化效率降低一些。
  • 抱歉 - 初读时错过了。
  • 使它更清楚,所以希望其他人会“立即得到它”。
  • 人们也容易忘记除以 2 的幂等于仅对正数进行位移。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2016-10-20
  • 2010-11-30
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
相关资源
最近更新 更多