Большинство операций с плавающей запятой в Java занимают около 1 нс, поэтому я не уверен, насколько быстрее вы ожидаете их выполнения в C ++.
Однако вызовы JNI часто занимают около 30 нс, поэтому, если вы не выполняете много операций с плавающей запятой за вызов, вы будете стоить больше, чем экономите.
Как показывает следующий микропроцессор, как только код подогревается, каждая операция занимает субнаносекунду.
Если вы хотите, чтобы это работало быстрее, вы можете использовать несколько ядер и увеличить его в 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