P
pmias
Gast
Hallo Forum,
ich war neulich einmal neugierig, wie groß der Geschwindigkeitsvorteil von JNA und JNI gegenüber purer Java-Implementierung ist. Immerhin ist dies einer der Argumente der nativen Implementierung in C, etc.
Als Test habe ich folgenden Algorithmus sowohl in einer Java-Methode, als auch als zwei externe native Libraries in C implementiert und rufe sie mit JNI bzw. JNA auf:
Der Rückgabewert sei hier erst einmal zweitrangig. Es ging mir primär darum, den PC erst einmal in der Schleife zu beschäftigen. Alle zwei C-Implementierungen ließen sich auf meinem Linux-System kompilieren und anstandslos aufrufen.
Um das Zeitverhalten zu testen, habe ich diese Methode mit steps=2100000000 aufgerufen und den Aufruf 20x in einer Schleife wiederholt (Stichwort: Java Runtime Optimierung).
Das Ergebnis hat mich doch überrascht. Als Durchschnittszeiten gerundet kamen bei meinem PC heraus:
- 14 s (Java pur)
- 19 s (JNI)
- 28 s (JNA)
Gut, ich weiß, daß JNA langsamer als JNI ist. Aber ich hätte ehrlich erwartet, daß beide Varianten immer noch schneller als pures Java wären, wenn es um Berechnungen geht.
Kann diese Relationen irgendwer bestätigen? Muß man vielleicht noch dem Compiler ein wenig gut zureden, indem man ihm weitere Parameter mitgibt? Oder ist eine simple for-Schleife mit Division nicht zu optimieren - wenn nicht, was dann?
ich war neulich einmal neugierig, wie groß der Geschwindigkeitsvorteil von JNA und JNI gegenüber purer Java-Implementierung ist. Immerhin ist dies einer der Argumente der nativen Implementierung in C, etc.
Als Test habe ich folgenden Algorithmus sowohl in einer Java-Methode, als auch als zwei externe native Libraries in C implementiert und rufe sie mit JNI bzw. JNA auf:
Java:
double iterate(int steps)
{
double v = 1;
int i;
for (i=1; i<=steps; i++) v /= i;
return v;
}
Der Rückgabewert sei hier erst einmal zweitrangig. Es ging mir primär darum, den PC erst einmal in der Schleife zu beschäftigen. Alle zwei C-Implementierungen ließen sich auf meinem Linux-System kompilieren und anstandslos aufrufen.
Um das Zeitverhalten zu testen, habe ich diese Methode mit steps=2100000000 aufgerufen und den Aufruf 20x in einer Schleife wiederholt (Stichwort: Java Runtime Optimierung).
Das Ergebnis hat mich doch überrascht. Als Durchschnittszeiten gerundet kamen bei meinem PC heraus:
- 14 s (Java pur)
- 19 s (JNI)
- 28 s (JNA)
Gut, ich weiß, daß JNA langsamer als JNI ist. Aber ich hätte ehrlich erwartet, daß beide Varianten immer noch schneller als pures Java wären, wenn es um Berechnungen geht.
Kann diese Relationen irgendwer bestätigen? Muß man vielleicht noch dem Compiler ein wenig gut zureden, indem man ihm weitere Parameter mitgibt? Oder ist eine simple for-Schleife mit Division nicht zu optimieren - wenn nicht, was dann?