Donc, fondamentalement, vous voulez que votre code s'exécute plus rapidement. JNI est la réponse. Je sais que vous avez dit, il ne fonctionne pas pour vous, mais permettez-moi de vous montrer que vous avez tort.
Voici Dot.java
:
import java.nio.FloatBuffer;
import com.googlecode.javacpp.*;
import com.googlecode.javacpp.annotation.*;
@Platform(include="Dot.h", options="fastfpu")
public class Dot {
static { Loader.load(); }
static float[] a = new float[50], b = new float[50];
static float dot() {
float sum = 0;
for (int i = 0; i < 50; i++) {
sum += a[i]*b[i];
}
return sum;
}
static native @MemberGetter FloatPointer ac();
static native @MemberGetter FloatPointer bc();
static native float dotc();
public static void main(String[] args) {
FloatBuffer ab = ac().capacity(50).asBuffer();
FloatBuffer bb = bc().capacity(50).asBuffer();
for (int i = 0; i < 10000000; i++) {
a[i%50] = b[i%50] = dot();
float sum = dotc();
ab.put(i%50, sum);
bb.put(i%50, sum);
}
long t1 = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
a[i%50] = b[i%50] = dot();
}
long t2 = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
float sum = dotc();
ab.put(i%50, sum);
bb.put(i%50, sum);
}
long t3 = System.nanoTime();
System.out.println("dot(): " + (t2 - t1)/10000000 + " ns");
System.out.println("dotc(): " + (t3 - t2)/10000000 + " ns");
}
}
et Dot.h
:
float ac[50], bc[50];
inline float dotc() {
float sum = 0;
for (int i = 0; i < 50; i++) {
sum += ac[i]*bc[i];
}
return sum;
}
Nous pouvons compiler et l'exécuter avec JavaCPP à l'aide des commandes de la ligne de ceux-ci:
$ javac -cp javacpp.jar Dot.java
$ java -jar javacpp.jar Dot
$ java -cp javacpp.jar:. Dot
Avec la valeur par défaut des trucs à partir de Fedora 15 sur un processeur Intel Core i7 870 @ 2.93 GHz-je obtenir ce genre de résultat:
dot(): 41 ns
dotc(): 26 ns
Ou à peu près 1,5 fois plus rapide. Nous avons besoin d'utiliser direct NIO tampons au lieu de tableaux, mais HotSpot peut accès direct NIO tampons aussi vite que des tableaux.
Mise à jour:
Cependant, si nous dérouler les boucles de 5 fois, les chiffres baissent à la suivante:
dot(): 9 ns
dotc(): 18 ns
Donc, oui, la JNI appel surcharge de ~13 ns fait devient le goulot d'étranglement ici...