web-dev-qa-db-ja.com

数学用のNode.jsとC ++

ファジーロジックを実装するサーバープログラムを作成する必要があり、そのイベント指向を利用するためにNode.jsで作成することにしました。私は難しい計算上の問題に取り組む必要があり、パフォーマンスを得るための最良の方法がわかりません。

  1. すべてをNode.jsに書き込みますそして、V8エンジンのパワーを数学的タスクに使用します。
  2. C++でモジュールを記述すべての数学関数を実装し、Nodeから呼び出します。

両方のプラットフォームでこれらのタイプの計算の経験がある人はいますか?

21
Pablosproject

とにかくNode.jsの部分が必要なので、先に進んですべてをNode.jsに実装します。十分に高速であれば、これは維持するのに十分簡単です。仮想マシン/ JITコンパイラの能力を予測することは非常に困難です。

十分に速くない場合は、まずアルゴリズムの改善について考えます。これで問題が解決せず、プロファイリングで計算に問題があることがわかった場合は、C++で再実装してください。ただし、パフォーマンスの高いC++コードを書くことは簡単ではないことに注意してください。あなたが手元に良いプロファイラーを持っていることを確認し、頻繁に測定してください。

一般的に、C++コードは、正しく記述した方が高速だと思います。トリッキーな部分はそれを正しく書くことです。詳細については、この記事 C++、Java、Scala、Goに関するGoogleペーパー を確認してください。要点-管理された言語により、コードの記述と保守がはるかに容易になりますが、生のパフォーマンスが必要な場合は、C++が最適です。しかし、それは多くの専門知識を必要とする代償であり、そのコードは維持するのがより困難です。

42
Tobias Langner

denshade、Cの実装は、jsで行ったように2e5ではなく2e5にのみ行きます(Github上の今日のrevにリンクしています)。

/ dev/nullにパイプし、jsも2e5に変更すると、現在のコンピューターでCの場合は約6.5秒、jsの場合は(ノードのいくつかのバージョンを使用)約8.5秒かかります。

あなたのアルゴリズムはO(n ^ 2)なので、2e6には15時間ではなく15分ほどかかると思いますが、試したことがありません。たぶん、それは何らかの理由でそれほど悪くはならないでしょう。

(SOで新しいので、担当者がいないため、直接コメントすることはできません。)

19
Tom Palmer

この種の質問に答えることはほとんど不可能です。これらのことについていつものように答えは、それはあなたのスキルとそれにどれだけの時間と労力を費やすことをいとわないかによって異なります。

C++には、重要なすべてのものをより厳密に制御できるため、常により高速で効率的な可能性があります。重要なことすべてを行うhaveと他の言語での一般的な実装の欠点は、彼らが何をしているのかを知っている人によっておそらく行われ、素朴または迅速な実装よりも優れている可能性がありますC++で

さらに、ボトルネックがとにかく思っているものではないことがよくあります。たとえば、データの読み取りに、不可能ではない計算の20倍の時間がかかることが判明した場合、どれほど速く問題になるかはほとんどありません。計算です。そして、ボトルネックがどこにあるかについての直感は、経験豊富な開発者にとってさえ、しばしばひどく間違っています。

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

上記のリンクは死んでいて、今は道に迷っています-

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

C++はCPUを使用し、数学演算を行うNode.jsよりも最大10倍高速に実行します。

そのサイトはここに移動しました https://benchmarksgame-team.pages.debian.net/benchmarksgame/which-programs-are-fastest.html

5

@denshadeコードを実行してプリントを削除しましたが、100000の数値のタイミングは例外的です。

  • nodejsの場合!

  • 6秒 gcc/clangコンパイル済みcの場合

  • 6秒。 hhvm(php)

  • 14秒 opcacheを含むphp7の場合

  • 15秒 php7のopcacheなし

Nodejsは、長時間にわたってコンパイルおよび最適化されているため、非常に高速です。

したがって、この場合のニーズに合った最良の言語である自分でテストする必要があるだけかもしれません。

2
Yehonal

複雑な数学的計算のためにC++ルートを使用する際に考慮すべきことの1つは、 [〜#〜] blas [〜#〜] 、LAPACK、などの既存の高性能ライブラリを活用できる可能性があることです。 ARMAなど。高度に最適化された機能を提供するために他の開発者がすでに多大な時間と労力を費やしています。 JavaScript用の同様のレベルの高性能ライブラリが見つかるかもしれません。確かに、行列計算または線形代数のボトルネックが特定されている場合は、これらのC++ライブラリの1つが適しています。

2
SmacL

計算が簡単でない場合は、警告を発行します。重い計算を行う場合、JavaScriptは非常に良くありません。私の物語には、ここで見つけることができる簡単な素数プログラムが含まれます: https://github.com/denshade/speedFun

短い話です。 C&JavaScriptで実装された非効率的な素数チェック関数である単純なものを作成しました。どちらも同じ方法で実装されます。最初の2000 000個の素数はCで5秒で検証されます。java.scriptの同じ関数は、node.jsで実行すると16時間以上続きました。

1
denshade

以下は、Node.jsが完璧なテクノロジーパートナーであることを証明している分野です。

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

CPUを集中的に使用するアプリケーションにNode.jsを使用することはお勧めできません。

ここにAPIの比較があります: https://www.linkedin.com/Pulse/nodejs-vs-Java-which-faster-apis-owen-rubel

0
Musa