在 C++ 中比较 & 与 % 的速度
Comparing speed of & vs % in C++
在C++命令中是真的吗
n & 1
比
更快,占用的内存更少
n % 2?
(其中 n 是 int 类型)
在全球范围内,有没有比使用 % 运算符更快地找到整数模 2 的余数的方法?提前致谢。
使用更多或更少的内存高度依赖于指令编码,但是 n & 1
可以快很多倍 [1],如果编译器没有针对相同的东西优化 n % 2
.当然,许多编译器确实会进行这种优化(或者可能会做同样的事情但处理对 %
产生有趣影响的负数的编译器,&
不需要 [=29] =] 关于)。
请注意,根据您想要实现的具体目标,负数需要特殊处理才能使用 & 1
。如果从 -1 & 1
得到 1
没问题,那么使用 &
确实是一个有效的选项,但在数学上有点奇怪。
另请注意,在比较性能时,您始终需要进行自己的基准测量[或非常了解特定编译器为特定处理器模型生成的内容],您不能总是依赖于阅读的内容互联网 - 包括我的帖子。
[1] 作为比较,大多数现代处理器在单个时钟周期内执行与运算,并且通常可以并行执行多个此类运算。用于余数的整数除法肯定没有那么快。我碰巧有一份 2012 年 1 月针对 "Family 15" 处理器的 AMD 优化指南。以 "remainder" 作为答案的 32 位除法运算最多可能需要 39 个时钟周期。因此,假设编译器没有将 %
优化为 AND 指令,那么使用 %
大约比 &
差 40-80 倍——当然假设它是一个有效的优化。
在C++命令中是真的吗
n & 1
比
更快,占用的内存更少n % 2?
(其中 n 是 int 类型)
在全球范围内,有没有比使用 % 运算符更快地找到整数模 2 的余数的方法?提前致谢。
使用更多或更少的内存高度依赖于指令编码,但是 n & 1
可以快很多倍 [1],如果编译器没有针对相同的东西优化 n % 2
.当然,许多编译器确实会进行这种优化(或者可能会做同样的事情但处理对 %
产生有趣影响的负数的编译器,&
不需要 [=29] =] 关于)。
请注意,根据您想要实现的具体目标,负数需要特殊处理才能使用 & 1
。如果从 -1 & 1
得到 1
没问题,那么使用 &
确实是一个有效的选项,但在数学上有点奇怪。
另请注意,在比较性能时,您始终需要进行自己的基准测量[或非常了解特定编译器为特定处理器模型生成的内容],您不能总是依赖于阅读的内容互联网 - 包括我的帖子。
[1] 作为比较,大多数现代处理器在单个时钟周期内执行与运算,并且通常可以并行执行多个此类运算。用于余数的整数除法肯定没有那么快。我碰巧有一份 2012 年 1 月针对 "Family 15" 处理器的 AMD 优化指南。以 "remainder" 作为答案的 32 位除法运算最多可能需要 39 个时钟周期。因此,假设编译器没有将 %
优化为 AND 指令,那么使用 %
大约比 &
差 40-80 倍——当然假设它是一个有效的优化。