Node.js与C的比较

4

在我的双核机器上,Node JS比用C语言编写的等效程序运行得更快。

是Node JS被优化得非常好以至于它实际上更加高效,还是我用C语言编写的程序有问题导致它更慢?

Node JS代码:

var Parallel = require("paralleljs"); 

function slow(n){
    var i = 0; 
    while(++i < n * n){}
    return i; 
}

var p = new Parallel([20001, 32311, 42222]);
p.map(slow).then(function(data){
    console.log("Done!"+data.toString()); 
});

C语言代码:

#include <stdio.h>
#include <pthread.h>

struct thread_s {
    long int n; 
    long int r; 
}; 

void *slow(void *p){
    thread_s *t = (thread_s*)p; 
    long int i = 0; 
    while(++i < t->n * t->n){}
    t->r = i; 
    pthread_exit( 0 ); 
}

thread_s arr[] = {{20001, 0}, {32311, 0}, {42222, 0}};

int main(){
    pthread_t t[3]; 
    for(int c = 0; c < 3; c++){
        pthread_create(&t[c], NULL, slow, &arr[c]); 
    }
    for(int c = 0; c < 3; c++){
        pthread_join(t[c], NULL); 
    }
    printf("Done! %ld %ld %ld\n", arr[0].r, arr[1].r, arr[2].r); 
    return 0; 
}

1
你应该添加用于C的编译命令。如果你没有使用至少-O2,那么基准测试基本上是毫无价值的。 - hyde
2
另外,你是如何处理计时的? - hyde
1
它有多快?我很想看到一些数字。 - Strix
3个回答

2
你正在对一个玩具程序进行基准测试,这不是比较编译器的好方法。此外,你所做的循环没有副作用。它只是将i设置为n * n。循环应该被优化掉了。你是否在运行未优化的代码?
尝试计算一些真实的东西,以近似于你后来将应用于生产中的工作负载。如果你的代码将涉及大量数值计算,你可以比较一下天真的矩阵乘法。

0

所有基本操作(+,-,Math.xx等)都映射到V8引擎中,该引擎将其作为C程序执行。因此,在这些情况下,您应该对C与Node.js具有相同的结果。

我还尝试过C#.NET与Node斐波那契数列45的比较。第一次运行时,C#比Node慢了5倍,这真的很奇怪。后来我意识到这是由于我运行了C#应用程序的调试模式。

发布后,它们非常接近(20秒Node,22秒C#),这可能只是测量不一致性造成的。

无论如何,这只是一个百分比问题。


0

目前问题缺乏基准测试的细节,因此无法对其做出明确的评价。但是,可以进行V8运行JavaScript和从C源代码编译的二进制程序的一般比较。

V8JIT编译方面非常出色,因此虽然存在JIT编译的开销,但这弥补了JavaScript动态特性的缺陷,因此对于简单的整数操作循环,JIT代码没有变慢的理由。

另一个考虑因素是启动时间。如果首先加载node.js并从交互提示符中加载JavaScript,则即使使用JIT,脚本的启动时间也很短,特别是与需要解析符号等的动态链接二进制相比。如果您有小的静态链接二进制文件,它将非常快速地启动,并且在新的node.js甚至开始寻找要执行的JavaScript之前已经完成了大量处理。您需要注意如何在基准测试中处理此问题,否则结果将毫无意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接