Nodejs与C ++性能的简单math

我制作了相同的程序来testingMac 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的这种操作更快?

谢谢。

更新:

切换双和使用长整型,它给了我22000ms,像Nodejs。

问题是,2种语言的代码是不相同的。 在C ++中,您使用了double并且在javascriptvariables中被优化为整数(尽pipe它们的types是Number ,通常情况下它是浮点types)。 当然,浮点运算总是比整数运算更长。

尝试在C ++版本中用longreplacedouble或更好。 这将确保你有两个版本的整数。

如果你这样做,请考虑发布结果给我们看看有什么不同。 Ť

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

有几件事要注意:

  • 代码i != 10000000000是危险的。 总是比较使用不等式( <> )而不是平等( ==!= )的双打。
  • 根本不需要使用浮点,而是使用long longtypes。 事情是,NodeJS实际上可能会自动执行此优化,因为它是dynamictypes的。
  • 你实际上不使用任何地方。 如果用g++ -O3编译,编译器实际上可以优化整个循环(试一试!)。