繁体   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