计算机对两个大数进行乘法、除法、减法、加法是否比较小的数花费更多的时间
does a computer take more time to multiply, divide, subtract, add two big numbers than smaller number
与两个小数相比,我们(人们)花更多的时间来乘、加、除和减两个大数。
计算机计算 5 * 2
的时间是否比计算 51234 * 987654
的时间长,还是计算的时间相同?
两个大于处理器字长的数字(例如两个 128 位数字)怎么办?
我看到文章了https://en.wikipedia.org/wiki/Multiplication_algorithm
取决于输入类型。对于 CPU 本身支持的原语,例如 64 位数字在 64 位上的乘法-CPU:不,这些原子操作总是花费完全相同的时间。对于非原始数据类型,例如 Java 的 BigInteger
或其他语言中的类似库-类:是的,这些不再是原子操作,因此在数量上有所不同所需时间取决于操作数的大小。
基元的乘法总是花费相同的时间,原因很简单:操作是硬连线构建的,没有任何条件执行,并且总是迭代 all 64bits on a 64bitCPU,不管输入是只有5bits长还是占满64bits。这同样适用于任何其他位数的架构。
编辑:
正如@nwellnhof 所述:某些指令实际上确实包含分支,例如浮点运算。通常这些指令是基于微码的,因此不能算作狭义上的原子指令。
假设您主要对 x86 系列感兴趣,那么曾经有一段时间乘法所花费的时间取决于操作数。那是在上个世纪——80486 及以下的处理器。从 Pentium 开始,imul
总是采用独立于输入的周期数。
除法一直是,现在仍然是一个需要多个周期的操作,确实以某种方式取决于输入,IIRC它主要取决于结果的大小。
如果您还考虑 "weird input" 浮点指令通常需要可变时间,例如非正规化。
与两个小数相比,我们(人们)花更多的时间来乘、加、除和减两个大数。
计算机计算 5 * 2
的时间是否比计算 51234 * 987654
的时间长,还是计算的时间相同?
两个大于处理器字长的数字(例如两个 128 位数字)怎么办?
我看到文章了https://en.wikipedia.org/wiki/Multiplication_algorithm
取决于输入类型。对于 CPU 本身支持的原语,例如 64 位数字在 64 位上的乘法-CPU:不,这些原子操作总是花费完全相同的时间。对于非原始数据类型,例如 Java 的 BigInteger
或其他语言中的类似库-类:是的,这些不再是原子操作,因此在数量上有所不同所需时间取决于操作数的大小。
基元的乘法总是花费相同的时间,原因很简单:操作是硬连线构建的,没有任何条件执行,并且总是迭代 all 64bits on a 64bitCPU,不管输入是只有5bits长还是占满64bits。这同样适用于任何其他位数的架构。
编辑:
正如@nwellnhof 所述:某些指令实际上确实包含分支,例如浮点运算。通常这些指令是基于微码的,因此不能算作狭义上的原子指令。
假设您主要对 x86 系列感兴趣,那么曾经有一段时间乘法所花费的时间取决于操作数。那是在上个世纪——80486 及以下的处理器。从 Pentium 开始,imul
总是采用独立于输入的周期数。
除法一直是,现在仍然是一个需要多个周期的操作,确实以某种方式取决于输入,IIRC它主要取决于结果的大小。
如果您还考虑 "weird input" 浮点指令通常需要可变时间,例如非正规化。