更快的Math.exp()通过JNI?

Dan*_*Dan 10 c java optimization java-native-interface

我需要Math.exp()经常从java 计算,是否有可能让本机版本比java的运行速度更快Math.exp()

我只尝试了jni + C,但它比普通的java慢.

mar*_*nus 15

这已经被要求了几次(参见例如这里).这是Math.exp()的近似值,从此博客文章中复制:

public static double exp(double val) {
    final long tmp = (long) (1512775 * val + (1072693248 - 60801));
    return Double.longBitsToDouble(tmp << 32);
}
Run Code Online (Sandbox Code Playgroud)

它基本上与具有2048个条目和条目之间的线性插值的查找表相同,但所有这些都使用IEEE浮点技巧.它比我的机器上的Math.exp()快5倍,但如果使用-server进行编译,这可能会有很大的不同.


Dan*_*wak 12

+1编写自己的exp()实现.也就是说,如果这真的是你应用程序的瓶颈.如果你可以处理一些不准确的问题,那里有许多非常有效的指数估计算法,其中一些可追溯到几个世纪.据我了解,Java的exp()实现相当慢,即使对于必须返回"精确"结果的算法也是如此.

哦,不要害怕在纯Java中编写exp()实现.JNI有很多开销,JVM能够在运行时优化字节码,有时甚至超出C/C++能够实现的范围.


jjn*_*guy 6

使用Java.

此外,缓存exp的结果,然后您可以比再次计算它们更快地查找答案.


Joh*_*kin 5

你也想Math.exp()在C中包装任何循环的调用.否则,Java和C之间的编组开销将超过任何性能优势.