Dav*_*vid 2 java optimization java-native-interface
一两年前,我创建了一个用Java编写的程序来模拟n体问题.最近,我已经疯狂地将程序重写为分布式程序,以便能够以更高的精度模拟更大的质量.
正如预期的那样,对旧程序进行分析表明,大约90%的程序用于计算浮点型值.如果我没记错的话,C/C++在进行算术运算时会快得多,尤其是浮点型计算.
无论如何,这是实际的问题:)
通过使用JNI,我可以期望速度的增加等于用C/C++编写的程序(用于计算),还是JVM会降低速度?
Java中大多数浮点运算大约需要1 ns,因此我不确定它们在C++中的速度会有多快.
但是,JNI调用通常需要大约30 ns,因此除非您每次调用执行大量浮点运算,否则您将花费比保存更多的成本.
正如以下微基准所暗示的那样,一旦代码热身,每个操作都是亚纳秒.
如果您希望速度更快,可以使用多个内核并使其速度提高4倍或更快.
public static void main(String[] args) throws Exception {
int length = 200000;
double[] a = fill(new double[length]);
double[] b = fill(new double[length]);
double[] c = fill(new double[length]);
double[] x = new double[length];
for (int i = 0; i < 10; i++)
testTime(length, a, b, c, x);
}
private static void testTime(int length, double[] a, double[] b, double[] c, double[] x) {
long start = System.nanoTime();
for (int i = 0; i < length; i++)
x[i] = a[i] * b[i] + c[i];
long time = System.nanoTime() - start;
System.out.printf("Average time per double operation was %.1f ns%n", time / 2.0 / length);
}
private static double[] fill(double[] doubles) {
for (int i = 0; i < doubles.length; i++)
doubles[i] = Math.random();
return doubles;
}
Run Code Online (Sandbox Code Playgroud)
版画
Average time per double operation was 10.9 ns
Average time per double operation was 17.9 ns
Average time per double operation was 1.7 ns
Average time per double operation was 1.0 ns
Average time per double operation was 0.9 ns
Average time per double operation was 0.8 ns
Average time per double operation was 0.9 ns
Average time per double operation was 0.8 ns
Average time per double operation was 1.0 ns
Average time per double operation was 0.9 ns
Run Code Online (Sandbox Code Playgroud)