1

Mac OS X で Nodejs と C++ のパフォーマンスをテストするために、同じプログラムを作成しました。

最初に C++ で:

#include <iostream>
#include <time.h>

using namespace std;

int main() {
    clock_t t1, t2;

    cout << "Initializing\n";

    t1 = clock();

    double m = 0;
    for (double i = 0; i != 10000000000; ++i) {
        m = i * -1 + i;
    }

    t2 = clock();
    float diff = (((float) t2 - (float) t1) / 1000000.0F) * 1000;

    cout << "Finalizing with " << diff << "ms\n";
}

Nodejs の 2 番目:

console.log("Initializing");

t1 = Date.now();

var m = 0;

for (var i = 0; i != 10000000000; i++) {
    m = i * -1 + i;
}

t2 = Date.now();
var diff = t2 - t1;
console.log("Finalizing with %dms", diff);

結果は、C++ で 50000 ミリ秒、Nodejs で 22000 ミリ秒でした。

その種の操作で Nodejs が高速なのはなぜですか?

ありがとう。

アップデート:

double を切り替えて long int を使用すると、Nodejs のように 22000ms になりました。

4

2 に答える 2

6

問題は、2 つの言語のコードが同等でないことです。あなたが使用したC++ではdouble、javascript変数は整数になるように最適化されました(ただし、それらの型はNumber一般に浮動小数点型です)。そしてもちろん、浮動小数点演算は常に整数演算よりも長くなります。

C++ 版では、またはより良いものに置き換えdoubleてみてください。これにより、両方のバージョンに整数があることが保証されます。intlong

その場合は、違いを確認するために結果を投稿することを検討してください。T

于 2013-06-29T20:52:04.250 に答える
2

このタイプのコードを使用してパフォーマンスを直接測定することは非常に困難です。C++ コンパイラと V8 JITter はどちらも、生成されたネイティブ コードのさまざまなタイプの最適化を使用します。

注意すべき点がいくつかあります。

  • コードi != 10000000000は危険です。等式 ( , <>) ではなく、常に不等式 ( ) を使用して double を比較します。==!=
  • 浮動小数点を使用する必要はまったくありませんlong long。代わりに型を使用してください。問題は、動的に型付けされるため、NodeJS は実際にこの最適化を自動的に行う可能性があるということです。
  • m実際にはどこも使用しません。でコンパイルすると g++ -O3、コンパイラは実際にループ全体を最適化することがあります (試してみてください!)。
于 2013-06-29T21:07:22.447 に答える