Así que Scala 2.9 recientemente apareció en las pruebas de Debian, trayendo consigo las colecciones en paralelo novedosas.Tratando con la sorprendente falta de ParList en scala.collections.parallel
Supongamos que tengo un código equivalente a
def expensiveFunction(x:Int):Int = {...}
def process(s:List[Int]):List[Int} = s.map(expensiveFunction)
ahora de la pequeñísima poco que había espigué sobre las colecciones paralelas antes de que los documentos en realidad se convirtió en mi máquina, que estaba esperando para paralelizar esta simplemente cambiando la Lista a un ParList
... pero para mi sorpresa, ¡no hay ninguno! (Solo ParVector
, ParMap
, ParSet
...).
Como workround, este (o una sola línea equivalente) parece que funciona bastante bien:
def process(s:List[Int]):List[Int} = {
val ps=scala.collection.parallel.immutable.ParVector()++s
val pr=ps.map(expensiveFunction)
List()++pr
}
produciendo una mejora del rendimiento x3 aproximadamente en mi código de prueba y alcanzar masivamente mayor uso de la CPU (de cuatro núcleos más hyperthreading i7). Pero parece un poco torpe.
Mi pregunta es una especie de agregado:
- Por qué no hay un
ParList
? - Dado que no hay un
ParList
, ¿hay un mejor patrón/modismo de que deba adoptar para que no me parezca que se están perdiendo? - solo estoy "detrás de los tiempos" Utilizar listas mucho en mis programas Scala (como todos los libros Scala I comprado de nuevo en los 2,7 días me enseñó) y que realmente debería hacer un mayor uso de
Vectors
? (Quiero decir, en C++ tierra generalmente necesitaría una muy buena razón para usarstd::list
sobrestd::vector
).