我最近写了一个Vector 3类,和我提交了规范化()函数检讨 - 朋友。 他说,这是很好的,但我应该在可能的情况,因为“倍增比划分更便宜”的CPU时间的倒数乘以。
我的问题简单地说就是,这是为什么?
我最近写了一个Vector 3类,和我提交了规范化()函数检讨 - 朋友。 他说,这是很好的,但我应该在可能的情况,因为“倍增比划分更便宜”的CPU时间的倒数乘以。
我的问题简单地说就是,这是为什么?
想想看,在基本操作硬件可以更容易地实现方面 - 加,减,移位,比较。 乘法即使在平凡的设置需要更少的这样的基本步骤-此外,它提供的进步算法,甚至更快-看到这里例如...但硬件一般不采取这些优势(可能除了极为特殊的硬件)。 例如,维基百科的URL说,“TOOM库克能为五个尺寸为N的乘法的成本做了尺寸为N的立方乘法” - 这是相当快的确是非常大的数字(Fürer的算法,一个漂亮的新发展,可以做Θ(n ln(n) 2Θ(ln*(n)))
-再次,见维基百科网页和链接由此)。
司只是intrisically慢,因为-再-每维基百科 ; 即使是最好的算法(其中一些是在硬件中实现,只是因为他们无处作为精密和复杂的乘法;-)不能望其项背的乘法那些最好的算法。
只是为了量化与不那么庞大的数字问题,这里有一些结果与gmpy ,易于使用的Python包装围绕GMP ,这往往有算术虽不不错的实现不一定是最新的,和最伟大的喘息。 在一个缓慢的(第一代;-) 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
[在具有语言**
“提高到权力”操作,比如Python和Fortran -和霍纳的计划多项式计算是远远优于反复举至电源操作 - !)。
如果你想回到小学的时候,你会记得,乘法是难度比加法和除法比乘法难。 事情是不是CPU的任何不同。
还记得,计算倒数涉及一个部门,所以,除非你计算倒数一次,并使用了三次,你不会看到一个加快。
对于(浮点)划分CPU操作比乘法复杂得多。 CPU必须做更多。 我决不是知识渊博的有关硬件,但你可以找到很多关于共同执行师(基于信息的牛顿迭代算法,例如)。
我也很小心,总是用倒数的,而不是分裂的乘法来获得CPU性能:他们可能不会给完全相同的结果。 这可能会或可能并不重要取决于您的应用程序。