通过减去价值来增加计算需求中的价值是否不同?

时间:2016-09-30 04:24:15

标签: optimization

所以,我不知道。我只是好奇而已。我不知道它是如何可能的,但是我已经遇到了必须跟踪价值变化的情况。

我可以通过减去或添加来做到这一点,所以我想知道是否存在差异。

1 个答案:

答案 0 :(得分:1)

您需要指定一个特定的环境,直到硬件以获得精确的答案,但我们当然可以做一些一般的观察。

在大多数现代硬件上,加法和减法需要相同的时间,并且使用基本相同的共享硬件来实现这两种操作。实际上,今天所有常见硬件都使用twos-complement arithmetic,并且任何能够在二进制补码运算中加法的单元都可以执行减法运算,因为任一输入都可以是负数。特别是,A - B相当于A + (-B),因此您可以通过否定第二个参数来使用加法单位执行减法。实际上,这就像反转(逻辑NOT)参数一样简单,并设置最低位的进位。

结果是,现代笔记本电脑,台式机,电话,服务器等硬件通常在1个周期内执行加法和减法,甚至更老或更模糊的芯片需要多个周期,两者通常花费相同的时间。

那是硬件方面。虽然软件可能会使事情变得混乱,例如通过使减法比添加慢 - 但这是不可能的。

C,C ++,Java等低级语言通常以简单的方式将其固定大小的整数类型映射到硬件提供的设施,因此加法和减法最终会花费相同的时间。即使这些语言提供硬件不能直接支持的整体类型(例如,32位平台上的64位long),小的软件方法或内联代码对于加法和减法路径通常是相同的

高级语言通常为数字类型实现类似bignum的类型 - 类型的范围没有特定限制,并根据需要扩展大小。这里可以想象减法比加法慢。例如,可能存在高度优化的bignum添加例程,然后可以通过在第二个参数上翻转符号来根据该添加例程实现减法,使减法略微变慢。

然而,看一下 bignum 的一个例子,我们看到这些实现基本上是对称的:Java 8 BigInteger.subtract() implementation正在the same thing做{ {1}}。

总的来说,硬件中二进制补码算法的普遍存在,加上合理的语言实现意味着加法和减法都可能具有相同的性能特征。

以上大部分内容也适用于浮点加法:在现代机器上,这些都需要相同的时间。

然而,签名无符号算术之间存在许多差异 - 但这是另一个主题。