2009-04-08 6 views

Antwort

12

Swig macht JNI auch einfacher.

In Bezug auf die Geschwindigkeit, ich vermute, dass es subtile Variationen geben wird - ich schlage vor, dass Sie einen Anruf wählen, von dem Sie wissen, dass Sie viel machen werden, und Benchmark alle angebotenen Lösungen.

+6

Downwoters: bitte erklären, oder der Downvote ist sinnlos ... –

10

JNI ist der schnellste. JNA ist im Vergleich zu JNI sehr langsam (der Aufruf-Overhead ist wahrscheinlich eine Größenordnung), aber es ist eine fantastische Bibliothek, weil sie den nativen Zugriff so einfach macht. JNA ist großartig, wenn Sie gelegentlich eine native API aufrufen müssen. Wenn Sie Wert auf Leistung legen, würde ich sie nicht in "engen Schleifen" verwenden.

Ich bin nicht sicher, wo NativeCall in das Spektrum passt.

2

This blog entry behauptet, dass aufgrund der Introspektion Mechanismen von JNA verwendet wird, wird es deutlich langsamer als JNI. Ich vermute, dass NativeCall ähnliche Mechanismen verwenden wird und auf ähnliche Weise funktionieren wird.

Allerdings sollten Sie wahrscheinlich Benchmark bezogen auf die jeweiligen Objekte Sie verweisen und/oder Rangierung zwischen Java und C

würde ich zweite die Empfehlung von SWIG. Das macht das Leben für die Java/C-Schnittstelle besonders einfach (einfacher).

+0

JNI marshall nicht. Ich denke nicht, dass JNA das auch tut. Native und Java-Code arbeiten beide mit den gleichen Daten im Speicher. – erickson

+0

Sie müssen eine Form der Objektübertragung durchlaufen - auch wenn das nur eine Zeigerreferenz ist. –

+0

Richtig, ich wollte einfach nicht, dass die Leute verwirrt werden, dass irgendeine Art von Serialisierung stattfindet; es sind nur Zeiger. Der primäre Overhead ist Introspektion. – erickson

3

Einige Parameter beeinflussen die Leistung von Schnittstellen zwischen Programmiersprachen: Auf welchem ​​Gerät läuft die JVM, wer hat sie entwickelt (falls es nicht die übliche Sun JVM ist), ob Java-Code aus nativem Code zurückgerufen werden muss , das Threading-Modell der JVM auf Ihrem Betriebssystem und wie asynchron der native Code sein wird ...

Sie finden vielleicht keinen zuverlässigen Benchmark, der genau das misst, was Sie brauchen, fürchte ich.