大多数浮点操作在 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;
}
打印
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