web-dev-qa-db-fra.com

Node.js vs C++ pour les mathématiques

Je dois écrire un programme serveur qui implémente une logique floue et je choisis de l'écrire dans Node.js pour tirer parti de son orientation événementielle. Je dois travailler avec un problème de calcul mathématique difficile, et je ne le fais pas savoir quel est le meilleur moyen d'obtenir des performances:

  1. Tout écrire dans Node.js et utiliser la puissance du moteur V8 pour la tâche mathématique.
  2. Écrivez un module en C++ qui implémente toutes les fonctions mathématiques et appelez-le depuis Node.

Quelqu'un qui a de l'expérience dans ce type de calcul sur les deux plateformes?

21
Pablosproject

Puisque vous avez quand même besoin de la partie Node.js, allez-y, implémentez tout dans Node.js. Si c'est assez rapide, c'est assez facile à maintenir. Il est très difficile de prédire la puissance d'un compilateur JIT/machine virtuelle.

Si ce n'est pas assez rapide, pensez d'abord aux améliorations algorithmiques. Si cela ne vous aide pas et si le profilage montre que le problème est le calcul, continuez, réinstallez-le en C++. Mais sachez que l'écriture de code C++ performant n'est pas triviale. Assurez-vous d'avoir un bon profileur sous la main et mesurez-le souvent.

En général, je dirais que le code C++ est plus rapide s'il est écrit correctement. La difficulté consiste à l'écrire correctement. Veuillez consulter cet article Google Paper sur C++, Java, Scala, Go pour plus d'informations. Gist is - les langages gérés facilitent grandement l'écriture et la maintenance du code, mais si vous avez besoin de performances brutes, C++ est le meilleur. Mais cela demande beaucoup d’expertise et le code est plus difficile à maintenir.

41
Tobias Langner

denshade, votre implémentation C ne concerne que les 2e5 et non 2e6, comme vous l'avez fait pour js (lien vers les révs d'aujourd'hui sur Github):

En piping vers/dev/null et en changeant js également en 2e5, je reçois environ 6,5 secondes pour C et environ 8,5 secondes pour js (en utilisant une version de node) sur mon ordinateur actuel.

Puisque votre algorithme est O (n ^ 2), je suppose que 2e6 prendra environ 15 minutes, et non 15 heures, mais je ne l’ai pas essayé. Peut-être qu'il s'effondre si mal pour une raison quelconque.

(Notez que je ne peux pas commenter directement, car je suis tout nouveau sur SO et je n'ai pas de représentant.)

17
Tom Palmer

il est quasiment impossible de répondre à ce genre de question. Comme toujours, la réponse à ces questions est que cela dépend de vos compétences et du temps et des efforts que vous êtes prêt à consacrer à ces tâches.

Le C++ a toujours le potentiel pour être plus rapide et plus efficace, car vous contrôlez de plus près tout ce qui compte. L’inconvénient est que vous (avez} _ faites tout ce qui compte et que les implémentations génériques dans l’autre langage sont probablement effectuées par quelqu'un qui sait ce qu’il fait et qui pourrait bien être mieux qu’une implémentation naïve ou rapide. c ++

De plus, vous constaterez souvent que le goulot d’étranglement n’est pas ce que vous croyez de toute façon, par exemple, si la lecture de vos données prend 20 fois plus de temps que les calculs, ce qui n’est pas impossible, la question de savoir à quelle vitesse les calculs sont. Et l'intuition sur les goulets d'étranglement est souvent très fausse, même pour les développeurs expérimentés.

7
jcoder

http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=gpp

C++ utilise le processeur et effectue jusqu'à 10 fois plus rapidement que Node.js en effectuant des opérations mathématiques.

4
Head Wizard Locke

Une chose à considérer lors de l'utilisation de la route C++ pour des calculs mathématiques complexes est la possibilité d'utiliser une bibliothèque haute performance existante, telle que BLAS , LAPACK, ARMA, etc. où d'autres développeurs l'ont déjà mise beaucoup de temps et d’efforts pour fournir des fonctionnalités hautement optimisées. Je doute que vous trouviez un niveau similaire de bibliothèque haute performance pour JavaScript. Certainement, si vous avez un goulot d'étranglement identifié autour des calculs matriciels ou de l'algèbre linéaire, l'une de ces bibliothèques C++ est la voie à suivre.

2
SmacL

Si vos calculs ne sont pas anodins, j'aimerais émettre un avertissement. JavaScript est très mauvais lorsque vous faites des calculs lourds. Mon histoire implique un programme principal simple que vous pouvez trouver ici: https://github.com/denshade/speedFun

Longue histoire courte. J'ai créé une fonction de vérification primaire simple et peu efficace implémentée dans C & JavaScript. Les deux sont mis en œuvre de la même manière. Les 2000 premiers premiers nombres premiers sont vérifiés en 5 secondes en C. La même fonction en javascript a duré plus de 16 heures lorsqu'elle a été exécutée dans node.js. 

1
denshade

J'ai lancé @denshade codes en supprimant les impressions et la synchronisation sur 100 000 numéros est exceptionnelle:

  • 3 sec. pour nodejs!

  • 6 sec. pour gcc/clang compilé c

  • 6 secondes . pour hhvm (php)

  • 14 secondes pour php7 avec opcache

  • 15 secondes pour php7 sans opcache

Nodejs est si rapide parce qu'il est compilé et optimisé au fil du temps.

alors, vous avez peut-être juste besoin de tester vous-même quel est le meilleur langage qui correspond à vos besoins dans ce cas.

1
Yehonal

Voici les domaines dans lesquels Node.js s’est révélé un partenaire technologique Idéal.

● I/O bound Applications
● Data Streaming Applications
● Data Intensive Real-time Applications (DIRT)
● JSON APIs based Applications
● Single Page Applications

Il est déconseillé d'utiliser Node.js pour les applications gourmandes en ressources CPU.

voici les comparaisons d’API: https://www.linkedin.com/Pulse/nodejs-vs-Java-which-faster-apis-owen-rubel

0
Musa