scala - concurrentes - arquitectura concurrente
Haskell, Scala, Clojure, qué elegir para coincidencia de patrones de alto rendimiento y concurrencia (2)
Recientemente comencé a trabajar en FP después de leer muchos blogs y publicaciones sobre las ventajas de la FP para la ejecución y el rendimiento simultáneos. Mi necesidad de FP ha sido influenciada en gran medida por la aplicación que estoy desarrollando. Mi aplicación es un inyector de datos basado en estado en otro subsistema donde el tiempo es muy crucial (cerca de 2 millones de transacciones por segundo). Tengo un par de tales subsistemas que deben ser probados. Estoy considerando seriamente usar FP para su paralelismo y quiero tomar el enfoque correcto, muchas publicaciones sobre SO hablan sobre las desventajas y ventajas de las construcciones de lenguaje Scala, Haskell y Clojure, las bibliotecas y el soporte de JVM. Desde el punto de vista del idioma, estoy bien para aprender cualquier idioma siempre que me ayude a lograr el resultado.
Ciertos mensajes favorecen a Haskell por la coincidencia de patrones y la simplicidad del lenguaje, el lenguaje de programación basado en JVM tiene una gran ventaja con respecto al uso de las bibliotecas existentes de Java. JaneStreet es una gran defensora de OCAML, pero realmente no estoy seguro acerca de la compatibilidad con desarrolladores y foros de ayuda para OCAML.
Si alguien ha trabajado con el manejo de datos tan grandes, por favor comparta su experiencia.
¿Quieres rápido o quieres fácil ?
Si lo desea rápido, debe usar C ++, incluso si está utilizando los principios de FP para ayudar en la corrección. Dado que el tiempo es crucial, el soporte para la programación en tiempo real (y difícil, si es necesario) será importante. Puede decidir exactamente cómo y cuándo tiene tiempo para recuperar la memoria y dedicarle solo el tiempo que tenga para esa tarea.
Los tres idiomas que ha indicado son ~ 2-3x más lentos que los C ++ ajustados a mano, casi óptimos , y, por lo tanto, solo cuando se usan de forma bastante tradicional. Todos usan la recolección de basura, lo que introducirá retrasos incontrolados al azar en sus transacciones.
Ahora bien, dicho esto, es mucho trabajo conseguir que esto funcione a prueba de balas con C ++. La aplicación de los principios de FP requiere mucho más repetitivo (incluso en C ++ 11), y la mayoría de las bibliotecas son mutables por defecto. (Editar: El óxido se está convirtiendo en una buena alternativa, pero está más allá del alcance de esta respuesta describir Rust con suficiente detalle).
Tal vez no tenga el tiempo y pueda darse el lujo de reducir otras especificaciones. Si no es el tiempo sino el rendimiento lo que es crucial, por ejemplo, entonces probablemente quiera Scala sobre Clojure (vea el Juego comparativo de idiomas de computadora , donde Scala gana cada punto de referencia al momento de escribir esto y tiene un tamaño de código más bajo en casi todos los casos). CLBG ya no es útil a este respecto, aunque puede encontrar archivos que respaldan estas declaraciones en el Archivo web)); OCaml y Haskell deben elegirse por otras razones (puntajes comparativos similares, pero tienen diferente sintaxis e interoperabilidad, etc.).
En cuanto a qué sistema tiene el mejor soporte de concurrencia, Haskell, Clojure y Scala están bien, mientras que OCaml es un poco escaso.
Esto se reduce a Haskell y Scala. ¿Necesita usar bibliotecas Java? Scala. ¿Necesita usar bibliotecas C? Probablemente Haskell. ¿No necesitas ninguno? Luego, puede elegir cualquiera de los estilos que prefiera estilísticamente sin tener que preocuparse excesivamente por haber hecho su vida mucho más difícil al elegir la incorrecta.
He hecho esto con Clojure, que resultó bastante efectivo por las siguientes razones:
- Estar en la JVM es una gran ventaja en términos de bibliotecas. Esto efectivamente excluyó a Haskell y Ocaml para mis propósitos, ya que necesitábamos un acceso fácil al ecosistema de Java y la integración con herramientas basadas en JVM (construcción de Maven, etc.)
- Puede caer en Java puro si necesita optimizar estrechamente los bucles internos. Hicimos esto para algunos códigos personalizados que procesan arreglos dobles [] grandes, pero el 99% del tiempo Clojure puede obtener el rendimiento que necesita. Consulte http://www.infoq.com/presentations/Why-Prismatic-Goes-Faster-With-Clojure para obtener algunos ejemplos de cómo hacer que Clojure sea realmente rápido (¡video bastante técnico, supone cierto conocimiento previo!). Una vez que comienza a contar la facilidad de explotar múltiples núcleos, Clojure es muy competitivo en rendimiento.
- Clojure tiene un soporte de concurrencia multi-core muy agradable. Esto resultó extremadamente útil para administrar tareas concurrentes. Ver http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
- El REPL crea un muy buen ambiente para las pruebas y el trabajo exploratorio de datos.
- Clojure es flojo, lo que lo hace adecuado para manejar conjuntos de datos más grandes que la memoria (suponiendo que tenga cuidado de no intentar forzar todo el conjunto de datos en la memoria de una vez). También hay algunas bonitas bibliotecas disponibles en dicho entorno, las más notables son Storm y Aleph . Storm puede ser particularmente interesante para usted, ya que está diseñado para el procesamiento distribuido en tiempo real de un gran número de eventos.
No puedo hablar con tanta experiencia de los otros idiomas, pero mi impresión de alguna experiencia práctica de Haskell y Scala es:
- Haskell es genial si te preocupa la pureza y la programación funcional estricta con tipos estáticos. El tipado estático puede ser una gran garantía de corrección, por lo que podría ser adecuado para un trabajo altamente algorítmico. Personalmente, considero que el FP puro es un poco rígido, hay muchas ocasiones en que el estado mutable es útil y creo que Clojure tiene un equilibrio ligeramente mejor aquí (al permitir la mulabilidad controlada a través de referencias administradas).
- Scala es un excelente lenguaje y comparte con Clojure las ventajas de estar en la JVM. Para mí, Scala es más como una "mejor Java" con características funcionales y un sistema de tipos muy impresionante. Es menos un cambio de paradigma de Clojure. Lo malo es que el sistema de tipos puede volverse bastante complejo / confuso.
En general, creo que podría estar contento con cualquiera de estos. Probablemente se reducirá a lo mucho que le importa la JVM y su punto de vista sobre los sistemas de tipo.