我最近写了一个Vector 3类,并且我将我的normalize()函数提交给了一个 friend 。他说这很好,但是我应该尽可能乘以倒数,因为在CPU时间上“相乘比相除要便宜”。

我的问题很简单,为什么呢?

最佳答案

从硬件可以更轻松地实现的基本操作的角度考虑它-加,减,移位,比较。即便是在微不足道的设置中,乘法也需要较少的基本步骤-此外,它还提供了更快的高级算法-例如,请参阅here ...但硬件通常不利用那些(除非是非常专业的硬件)。例如,如Wikipedia URL所述,“Toom–Cook可以以五次N大小的乘法来进行N大小的立方乘法” –确实对于非常大的数字来说这是非常快的(Fürer算法,这是一个相当新的发展,可以做Θ(n ln(n) 2Θ(ln*(n)))-再次,请参见Wikipedia页面及其链接)。

除以wikipedia而言,除法本质上是缓慢的;即使是最好的算法(其中有些是在硬件中实现的,只是因为它们远没有最好的乘法算法那么复杂和复杂;-)也无法与乘法算法相提并论。

只是为了用不太大的数字来量化问题,这是gmpy的一些结果,GMP是围绕scheme的易于使用的Python包装器,尽管不一定是最新最好的语言,但它往往具有很好的算术实现。 。在慢速(第一代;-)的Macbook Pro上:

$ python -mtimeit -s'import gmpy as g; a=g.mpf(198792823083408); b=g.mpf(7230824083); ib=1.0/b' 'a*ib'
1000000 loops, best of 3: 0.186 usec per loop
$ python -mtimeit -s'import gmpy as g; a=g.mpf(198792823083408); b=g.mpf(7230824083); ib=1.0/b' 'a/b'
1000000 loops, best of 3: 0.276 usec per loop

如您所见,即使是在很小的尺寸(数字中的位数)上,并且通过完全相同的对速度着迷的人们进行优化的库,通过倒数相乘也可以节省除法时间的1/3。

仅在极少数情况下,这几纳秒是一个生死攸关的问题,但是,当它们时,当然,如果您反复用相同的值除(以摊销1.0/b操作!),那么这些知识可以挽救生命。

(大体上是相同的-与x*x相比,[x**2通常可以节省时间(在具有**“raise to power”运算符的语言中,例如Python和Fortran)-而且,用于多项式计算的Horner ojit_a优于重复提高-上电操作!-)。

关于performance - 为什么乘除乘除便宜?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1117674/

10-10 18:30