我需要Math.exp()
经常从java 计算,是否有可能让本机版本比java的运行速度更快Math.exp()
?
我只尝试了jni + C,但它比普通的java慢.
这已经被要求了几次(参见例如这里).这是Math.exp()的近似值,从此博客文章中复制:
public static double exp(double val) { final long tmp = (long) (1512775 * val + (1072693248 - 60801)); return Double.longBitsToDouble(tmp << 32); }
它基本上与具有2048个条目和条目之间的线性插值的查找表相同,但所有这些都使用IEEE浮点技巧.它比我的机器上的Math.exp()快5倍,但如果使用-server进行编译,这可能会有很大的不同.
+1编写自己的exp()实现.也就是说,如果这真的是你应用程序的瓶颈.如果你可以处理一些不准确的问题,那里有许多非常有效的指数估计算法,其中一些可追溯到几个世纪.据我了解,Java的exp()实现相当慢,即使对于必须返回"精确"结果的算法也是如此.
哦,不要害怕在纯Java中编写exp()实现.JNI有很多开销,JVM能够在运行时优化字节码,有时甚至超出C/C++能够实现的范围.
使用Java.
此外,缓存exp的结果,然后您可以比再次计算它们更快地查找答案.
你也想Math.exp()
在C中包装任何循环的调用.否则,Java和C之间的编组开销将超过任何性能优势.