Nodejs vs C ++性能简单的数学

时间:2013-06-29 20:48:19

标签: c++ node.js

我制作了相同的程序来测试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,Nodej为22000。

为什么Nodejs在这种操作中更快?

感谢。

更新

切换double并使用long int,它给了我22000ms,就像Nodejs一样。

2 个答案:

答案 0 :(得分:6)

问题是2种语言的代码不相同。在C ++中,您使用double并在javascript变量中将其优化为整数(尽管它们的类型为Number,通常情况下为浮点类型)。当然,浮点运算总是比整数运算更长。

尝试将double替换为int或更好地替换为C ++版本中的long。这将确保您在两个版本中都有整数。

如果您这样做,请考虑为我们发布结果以查看差异。 Ť

答案 1 :(得分:2)

使用这种类型的代码直接测量性能非常困难。 C ++编译器和V8 JITter都使用生成的本机代码的不同类型的优化。

需要注意的一些事项:

  • 代码i != 10000000000很危险。始终使用不等式(<>)而不是等式(==!=)来比较双打。
  • 根本不需要使用浮点数,而是使用long long类型。问题是,NodeJS实际上可以自动执行此优化,因为它是动态类型的。
  • 您实际上并未在任何地方使用m。如果使用g++ -O3进行编译,编译器实际上可能会优化掉整个循环(试试吧!)。