mathematical - Node.js vs C++ para mathematic
numerical library javascript (8)
Tengo que escribir un programa de servidor que implemente una lógica difusa y elijo escribirlo en Node.js para aprovechar su orientación a eventos. Tengo que trabajar con problemas matemáticos difíciles de cálculo, y no sé cuál es la mejor manera de obtener un rendimiento:
- Escriba todo en Node.js y use la potencia del motor V8 para la tarea matemática.
- Escriba un módulo en C ++ que implemente toda la función matemática y llámelo desde Node.
¿Alguien que tenga experiencia en este tipo de computación en ambas plataformas?
Es casi imposible responder a este tipo de pregunta. La respuesta como siempre para estas cosas es que depende de tus habilidades y de cuánto tiempo y esfuerzo estés dispuesto a poner en ellas.
C ++ siempre tiene el potencial de ser más rápido y más eficiente, ya que tiene un control mucho más estricto sobre todas las cosas que importan. La desventaja de que tiene que hacer todas las cosas que importan y las implementaciones genéricas en el otro idioma probablemente las haga alguien que sepa lo que están haciendo y podría ser mejor que una implementación ingenua o rápida en c ++
Además, a menudo encontrará que el cuello de botella no es lo que cree que será de todos modos, por ejemplo, si la lectura de sus datos demora 20 veces más que los cálculos que no son imposibles, entonces no importa lo rápido que sea. los cálculos son. Y la intuición acerca de dónde se encuentran los cuellos de botella a menudo está mal, incluso para los desarrolladores con experiencia.
He ejecutado códigos de @denshade que eliminan impresiones y el tiempo en 100000 números es excepcional:
3 seg. para nodejs!
6 seg. para gcc / clang compilado c
6 seg . para hhvm (php)
14 segundos para php7 con opcache
15 segundos para php7 sin caché
Nodejs es tan rápido porque está compilado y optimizado a lo largo del tiempo.
Por lo tanto, tal vez solo necesite probar por su cuenta cuál es el mejor lenguaje que se adapta a sus necesidades en este caso.
Las siguientes son las áreas donde Node.js se está mostrando como un socio tecnológico perfecto.
● I/O bound Applications
● Data Streaming Applications
● Data Intensive Real-time Applications (DIRT)
● JSON APIs based Applications
● Single Page Applications
No es recomendable usar Node.js para aplicaciones que requieren un uso intensivo de la CPU.
Aquí hay comparaciones de API: https://www.linkedin.com/pulse/nodejs-vs-java-which-faster-apis-owen-rubel
Si sus cálculos no son triviales, me gustaría emitir una advertencia. JavaScript es muy malo cuando vas para cálculos pesados. Mi historia involucra un programa principal simple que puede encontrar aquí: https://github.com/denshade/speedFun
Larga historia corta. Creé una simple, ya sea ineficiente función de comprobación principal implementada en C y JavaScript. Ambos se implementan de la misma manera. Los primeros 2000 000 primos se verifican en 5 segundos en C. La misma función en javascript duró más de 16 horas cuando se ejecuta en node.js.
Una cosa a considerar al pasar por la ruta C ++ para cálculos matemáticos complejos es que podría aprovechar una biblioteca de alto rendimiento existente, como BLAS , LAPACK, ARMA, etc., donde otros desarrolladores ya han dedicado mucho tiempo y esfuerzo a proporcionar Funcionalidad altamente optimizada. Dudo que encuentre un nivel similar de biblioteca de alto rendimiento para JavaScript. Ciertamente, si tiene un cuello de botella identificado alrededor de los cálculos matriciales o el álgebra lineal, una de estas bibliotecas de C ++ es el camino a seguir.
Ya que necesita la parte Node.js de todos modos, adelante, implemente todo en Node.js. Si es lo suficientemente rápido, esto es bastante fácil de mantener. Es muy difícil predecir el poder de una máquina virtual / compilador JIT.
Si no es lo suficientemente rápido, primero piense en las mejoras algorítmicas. Si esto no ayuda y si el perfil muestra que el cálculo es el problema, adelante, vuélvalo a implementar en C ++. Pero tenga en cuenta que escribir código de C ++ performante no es trivial. Asegúrese de tener un buen perfilador a mano y mídalo con frecuencia.
En general, diría que el código C ++ es más rápido si se escribe correctamente. La parte difícil es escribirlo correctamente. Consulte este artículo en Google Paper en C ++, Java, Scala, Go para obtener más información. Lo esencial es que los idiomas administrados hacen que sea mucho más fácil escribir y mantener el código, pero si necesita un rendimiento en bruto, C ++ es el mejor. Pero tiene el precio de necesitar mucha experiencia y que el código es más difícil de mantener.
denshade, tu implementación de C solo va a 2e5, no a 2e6, como has hecho para js (vinculando a las revisiones de hoy en Github):
Cambiando a / dev / null, y cambiando js también a 2e5, obtengo unos 6,5 segundos para C y unos 8,5 segundos para js (usando alguna versión de nodo) en mi computadora actual.
Como su algoritmo es O (n ^ 2), esperaría que 2e6 demore unos 15 minutos, no 15 horas, pero no lo he probado. Tal vez se deshaga tan mal por alguna razón.
(Tenga en cuenta que no puedo comentar directamente, ya que soy nuevo en SO y no tengo representantes).
http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=gpp
C ++ usa la CPU y realiza hasta 10 veces más rápido que Node.js haciendo operaciones matemáticas.