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中的第二个:

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,它给了我 22000 毫秒,就像 Nodejs 一样。

4

2 回答 2

6

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

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

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

于 2013-06-29T20:52:04.250 回答
2

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

需要注意的几点:

  • 代码i != 10000000000很危险。始终使用不等式 ( <>) 而不是等式 ( ==, ) 比较双精度数!=
  • 根本不需要使用浮点,long long而是使用类型。问题是,NodeJS 实际上可能会自动进行这种优化,因为它是动态类型的。
  • 你实际上并没有在m任何地方使用。如果您使用 编译 g++ -O3,编译器实际上可能会优化整个循环(试试看!)。
于 2013-06-29T21:07:22.447 回答