¿Se puede traducir este código Java a código Clojure que sea tan rápido o casi tan rápido?Convertir código Java en código Clojure rápido
He podido obtener funciones más simples como agregar dos matrices para ejecutar a velocidades razonables con insinuación de tipo, pero no pude hacer que Clojure hiciera lo que las siguientes funciones hacen en un tiempo razonable usando cualquiera Matrices Java interop o Incanter y utilizando estilos funcionales o imperativos.
¿Me falta algo sobre el tipo de alusión o es simplemente lo mejor para hacer este tipo de cosas 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é quiere decir exactamente que el que los argumentos de la función están enmarcados? Pude obtener código clojure que agrega dos arreglos java 2d para correr bastante cerca de las velocidades nativas. Tal como lo entiendo ahora, la función extrae números de java, los agrega en clojure, y luego empuja el resultado de regreso a una matriz java, y el tipo apunta allí para las interacciones de clojure a java. Pero mis versiones de clojure del código java hacen lo mismo, solo que hay más operaciones en clojure antes de volver a enviar las cosas a Java. Pero no entiendo por qué las operaciones adicionales harían las cosas mucho más lentas. – 2daaa
Cuando digo llamada de función, me refiero a llamar a una función clojure. si ejecuta (my-function 42 :-P) el número 42 es una instancia de clase Integer y no una int primitiva, incluso si escribe insinuación. también el tipo de retorno de una llamada de función clojure es siempre un Objeto y nunca una primitiva (antes de clojure 1.3) La transición a clojure 1.3 puede caer un cero desde el tiempo de ejecución de algunas funciones muy numéricas. –
Sin sugerencias tipográficas, ¿cómo trataría con las colecciones mix-type? –