c++ - 在 C++ 中比较 & 与 % 的速度

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

<分区>

在C++命令中是真的吗

n & 1

更快并且占用更少的内存

n % 2?

(其中 n 是 int 类型)

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

最佳答案

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

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

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

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

关于c++ - 在 C++ 中比较 & 与 % 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28160536/

相关文章:

c++ - 递归创建树

javascript - 为什么 CoffeeScript 使用 %% 代替标准的 javascript 运算符 % 来表示模数

math - 找到两个整数的最大同余模?

javascript - 哪个更适合 JavaScript 加载时间 : Compress all in one big file or load all asynchronously?

Python:为给定列表查找随机 k 子集分区

javascript - $.ready() 在关闭主体之前

javascript - 为什么 0.86%1 不是零而是 0.86,因为 0.86/1 的余数为 0?

c++ - 将数组作为参数传递给 std::thread

c++ - LibPng 读入结构

java - 为什么charles不能用c++抓取http请求?