Ce code Java peut-il être traduit en un code Clojure aussi rapide ou presque aussi rapide?Transformer le code Java en code Clojure rapide
J'ai pu obtenir des fonctions plus simples comme l'ajout de deux tableaux pour fonctionner à des vitesses raisonnables avec indication de type, mais je ne pouvais pas faire fonctionner Clojure comme le font les fonctions ci-dessous dans un laps de temps raisonnable Java interop ou Incanter matrices et en utilisant des styles fonctionnels ou impératifs. Est-ce que je manque quelque chose à propos de l'indication de type ou est-il préférable de faire ce genre de chose en Java?
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;
}
Qu'est-ce que cela signifie exactement que le les arguments de la fonction sont encadrés? J'ai été en mesure d'obtenir le code de clojure qui ajoute deux tableaux java 2d pour fonctionner assez proche des vitesses natives. Comme je le comprends maintenant, la fonction tire des nombres de Java, les ajoute dans clojure, puis repousse le résultat dans un tableau java, et le type y fait allusion pour les interactions clojure to java. Mais mes versions clojure du code java font la même chose, mais il y a plus d'opérations dans clojure avant que je ne ramène les choses à Java. Mais je ne comprends pas pourquoi les opérations supplémentaires rendraient les choses tellement plus lentes. – 2daaa
Quand je dis appel de fonction, je fais référence à l'appel d'une fonction de clojure. Si vous exécutez (my-function 42 :-P) le nombre 42 est une instance de classe Integer et non un int primitif, même si vous tapez hint it. aussi le type de retour d'un appel de fonction clojure est toujours un objet et jamais une primitive (avant clojure 1.3) La transition vers clojure 1.3 peut laisser tomber un zéro du temps de fonctionnement de certaines fonctions fortement numériques. –
Sans indication de type, comment traiteriez-vous les collections de types mixtes? –