为什么MOD
操作比multiplication
更贵,比factor of 2
贵一点?请更具体地说明CPU如何执行除法运算并返回MOD运算的结果。
在以下示例中,每个线程运行一秒钟。测试是在SPARC
处理器上进行的。
// multiplication
void someThread() {
int a = 10234;
while (true) {
opers++;
a = a * a;
a++;
}
// opers ~ 26 * 10^6 in a sec.
}
// MOD
void someThread() {
int a = 10234;
while (true) {
opers++;
a = a % 10000007;
a++;
}
// opers ~ 12 * 10^6 in a sec.
}
答案 0 :(得分:12)
MOD是除法运算,而不是乘法运算。分割比乘法更贵。
有关MOD操作的更多信息,请访问:http://en.wikipedia.org/wiki/Modulo_operation
答案 1 :(得分:5)
答案 2 :(得分:5)
用于除法的算法(处理器执行除法和门中实现的算法的乘法)比乘法更昂贵。事实上,一些具有良好复杂性的划分算法正在使用乘法作为基本步骤。
即使你使用在学校学到的天真算法。它们都具有相同的渐近复杂度,但是除法的常数更大(你必须找出数字并且这不是微不足道的,所以你可以搞砸并且必须解决这个问题)。
答案 3 :(得分:1)
是的,mod比乘法更昂贵,因为它是通过除法实现的。 (CPU通常在除法时返回商和余数。)但是两个线程都使用乘法。复制/粘贴错误?
答案 4 :(得分:0)
mod本质上与除法相同(出于某些原因,某些系统提供了“ divmod”)。
二进制长多重乘法和二进制长除法之间的最大区别是,长除法要求您在每次减法后执行溢出测试,而长乘法则在初始屏蔽过程之后无条件执行加法。
这意味着您可以很容易地重新排列和并行化长乘法中的加法,但是对于长除法则不能这样做。我在https://stackoverflow.com/a/53346554/5083516
上写了一个更长的答案