簡體   English   中英

Node.js與C ++的性能實現簡單數學

[英]Nodejs vs C++ performance for simple mathematic

我制作了相同的程序來測試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中排名第二:

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 ++,結果為50000ms,對於Nodejs,結果為22000ms。

為什么Node.js在這種操作上更快?

謝謝。

更新:

切換雙倍並使用long int,它給了我22000毫秒,就像Nodejs。

問題是兩種語言的代碼不相同。 在C ++中,您使用了double並且在javascript中將變量優化為整數(盡管它們的類型為Number ,通常情況下為浮點類型)。 而且,當然,浮點運算總是比整數運算長。

嘗試用int代替double或在C ++版本中用long更好。 這樣可以確保兩個版本中都有整數。

如果您這樣做,請考慮發布結果以供我們查看差異。 Ť

使用這種類型的代碼來衡量性能非常困難。 C ++編譯器和V8 JITter都對生成的本機代碼使用不同類型的優化。

需要注意的幾件事:

  • 代碼i != 10000000000是危險的。 始終使用不等號( <> )而不是等號( ==!= )比較雙精度數。
  • 根本不需要使用浮點,而是使用long long類型。 事實是,NodeJS實際上可以自動執行此優化,因為它是動態鍵入的。
  • 您實際上並沒有在任何地方使用m 如果使用g++ -O3進行編譯,則編譯器實際上可以優化整個循環(嘗試一下!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM