我基本上是在制作一个Java程序,它必须非常快速地运行大量计算(每帧,目标是至少30 f / s)。这些将主要是三角函数和幂函数。 我问的问题是: 哪个更快:使用已经提供的Java Math函数?或者编写我自己的函数来运行?
答案 0 :(得分:8)
内置的Math
函数将极难被击败,因为它们中的大多数具有特殊的JVM魔法,使得它们使用硬件内在函数。你可以可以想象通过用很多的工作来交换准确性来击败一些,但是你不太可能击败{ {1}}实用程序。
答案 1 :(得分:1)
您将需要使用java.lang.Math
函数,因为大多数函数在JVM中运行native
。您可以看到源代码here。
答案 2 :(得分:1)
许多非常聪明且资质良好的人多年来为使数学功能尽可能快速准确地工作付出了很多努力。因此,除非你比所有人更聪明,并且有多年的空闲时间花在这上面,否则你不太可能做得更好。
他们中的大多数也是原生的 - 他们实际上并不是Java。因此,在Java中编写更快的版本将是一个完全禁止的。当你自己编写时,你可能最好使用C和汇编语言的混合;而且你需要知道你将要运行的任何硬件的所有怪癖。
此外,目前的实施已经过多年的测试,全世界有数百万人以某种方式使用Java。您无法访问相同的测试人员,因此您的功能将自动比标准功能更容易出错。这是不可避免的。
那么你还在考虑编写自己的函数吗?
答案 3 :(得分:1)
如果你能承受1e-15ish的相对错误(或者更像是1e-13ish for pow(double,double)),你可以尝试这个,如果你经常调用它,它应该比java.lang.Math更快: http://sourceforge.net/projects/jafama/
正如一些人所说的那样,如果你想要保持相似的(1-ulp-ish)精度,通常很难击败纯Java中的java.lang.Math,但是双精度的准确度稍微低一点往往是完全可以忍受的(和仍然比使用浮点计算时更准确,并且可以允许一些明显的加速。
答案 4 :(得分:0)
可能的选项是缓存值。如果你知道你只需要一组固定的值,或者你可以在没有完美准确的情况下离开,那么这可以节省大量的时间。假设您想要为每个度数绘制大量的圆计算sin和cos的值。然后在绘图时使用这些值。大多数圆圈都足够小,以至于您无法看到差异,并且使用这些库可以完成非常大的小数字。
一定要测试这是否值得。在我5岁的macbook上,我可以对cos进行一百万次评估。