Kann dieser Java-Code in Clojure-Code übersetzt werden, der so schnell oder fast so schnell ist?Java-Code in schnellen Clojure-Code umwandeln
Ich konnte einfachere Funktionen wie das Hinzufügen von zwei Arrays zu vernünftigen Geschwindigkeiten mit Typhinweis bekommen, aber ich konnte Clojure nicht dazu bringen, das zu tun, was die unten genannten Funktionen in einer vernünftigen Zeitspanne tun Java-Interop- oder Incanter-Matrizen und Verwendung von funktionalen oder imperativen Stilen.
Fehle ich etwas über Typ Hinting oder ist es am besten, so etwas in Java zu tun?
static double[][] grad2_stencil= { {0,0,-1,0,0},
{0,0,16,0,0},
{-1,16,-60,16,-1},
{0,0,16,0,0},
{0,0,-1,0,0} };
public static double grad2(double[][] array, int x, int y){
double temp=0;
int L=array.length;
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
temp+=array[((x+i-2)%L+L)%L][((y+j-2)%L+L)%L]*grad2_stencil[i][j];
}
}
return temp/12.0;
}
public static double[][] grad2_field(double[][] arr){
int L=arr.length;
double[][] result=new double[L][L];
for(int i=0; i<L; i++){
for(int j=0; j<L; j++){
result[i][j]=grad2(arr, i, j);
}
}
return result;
}
Was das genau bedeutet, dass die Funktionsargumente sind eingerahmt? Ich konnte Clojure-Code bekommen, der zwei 2d-Java-Arrays hinzufügt, um ziemlich nah an den nativen Geschwindigkeiten zu laufen. Wie ich es jetzt verstehe, zieht die Funktion Zahlen aus Java ein, fügt sie in clojure hinzu und drückt dann das Ergebnis zurück in ein Java-Array, und der Typ deutet dort auf die Clojure-Java-Interaktionen hin. Aber meine clojure-Versionen des Java-Codes tun dasselbe, nur dass es mehr Operationen in clojure gibt, bevor ich die Dinge zurück nach Java schiebe. Aber ich verstehe nicht, warum die zusätzlichen Operationen die Dinge so viel langsamer machen würden. – 2daaa
Wenn ich Funktionsaufruf sage, beziehe ich mich darauf, eine Clojure-Funktion aufzurufen. Wenn Sie (my-function 42 :-P) ausführen, ist die Zahl 42 eine Integer-Klasseninstanz und kein primitives int, selbst wenn Sie es eingeben. Auch der Rückgabetyp eines Clojure-Funktionsaufrufs ist immer ein Objekt und niemals ein Primitiv (vor Clojure 1.3). Der Übergang zu Clojure-Funktion 1.3 kann eine Null von der Laufzeit einiger stark numerischer Funktionen abbrechen. –
Ohne Typhinweis, wie würden Sie mit gemischten Sammlungen umgehen? –