2011-12-13 9 views
7

¿Existen inconvenientes al usar scalacl plugin?Operaciones de Scala con rendimiento de matrices (complemento scalacl)

Estoy planeando usar scala en mi proyecto. He escrito un poquito de código en scala para ver su tiempo de ejecución.

(1 to 1000000).map(1 + _).sum 

1. Sin Plugin

se compila a algo como esto:

BoxesRunTime.unboxToInt(((TraversableOnce)Predef..MODULE$.intWrapper(1).to(1000000).map(new MyScala..anonfun.1(), IndexedSeq..MODULE$.canBuildFrom())).sum(Numeric.IntIsIntegral..MODULE$)); 

y correr en unos 375 ms

2. Con el plugin scalacl

int i = 1; 
int j = 1000000; 
int k = j; 
int m = i; 
for (VectorBuilder localVectorBuilder = new VectorBuilder(); m <= k;) { 
    int n = m; 
    localVectorBuilder.$plus$eq(BoxesRunTime.boxToInteger(1 + n)); 
    m += 1; 
} 
int a = BoxesRunTime.unboxToInt(localVectorBuilder.result().sum(Numeric.IntIsIntegral..MODULE$)); 

259 ms

+2

Mejora del 30% no es mucho. Optimicé una parte de mi código, que ahora usa matrices y bucles while, para una aceleración de 100x. Idiomatic Scala puede ser muy lento. Por ejemplo, si te deshaces del boxeo, obtendrás algo más impresionante. – ziggystar

+0

Por cierto, 'Range # sum' ahora está optimizado en trunk y se ejecuta en tiempo constante' O (n) 'en lugar de' O (n) 'lineal. Las mejoras algorítmicas son la mayoría de las veces preferibles. – soc

Respuesta

10

contras posibles que se me ocurren:

1) La optimización de bucle parece funcionar y el desarrollador parece muy competente, pero no se dice en negrita en la pantalla "Acerca de ScalaCL" " ¡ScalaCL no está listo para producción! ". En otras palabras, hay una pequeña posibilidad de que introduzca errores e inestabilidad

2) Debe recordar compilar con el complemento cada vez, de lo contrario, de repente puede encontrar que tiene problemas de rendimiento. Asegúrese de que el complemento se mantendrá/compatible en el mediano o largo plazo

3) Puede confiar en sus optimizaciones, lo que le lleva a escribir un código ineficiente, mientras que identificar y optimizar manualmente los cuellos de botella puede conducir a un código más rápido en general, en otras palabras, puede en efecto "papel sobre las grietas"

4) Es una dependencia adicional de la biblioteca y agrega complejidad a sus archivos de compilación

Usted pidió contras, pero estos son bastante menores en comparación con sus ventajas. Personalmente, no dudaría en utilizar las optimizaciones de bucles para proyectos personales; No estoy tan seguro sobre las colecciones cl todavía (las probé y encontré mi GPU un poco más lenta que mi CPU, obviamente depende del hardware disponible), pero creo que el proyecto tiene un gran futuro, ya sea solo o incorporado a el compilador estándar y las bibliotecas. He visto algunas aceleraciones muy dramáticas (hasta 20 veces más rápido) para algún código.

Cuestiones relacionadas