节点js与C的比较

时间:2013-09-28 10:35:54

标签: c node.js

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

节点是否经过如此优化以至于它实际上更高效,或者我的C程序有什么问题导致它变慢?

节点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; 
}

3 个答案:

答案 0 :(得分:2)

您正在对玩具程序进行基准测试,这不是比较编译器的好方法。此外,您正在做的循环没有副作用。它只需将i设置为n * n即可。应该优化循环。你没有经过优化吗?

尝试计算一些真实的东西,它近似于您稍后将在生产中应用的工作量。如果你的代码很重,你就可以对一个天真的矩阵乘法进行基准测试。

答案 1 :(得分:0)

所有基本操作(+ - ,Math.xx等)都映射到V8引擎,它只是作为C程序执行它。因此,在这种情况下,C vs Node.js应该有相同的结果。

此外,我尝试了C#.NET与45的Node Fibonacci。而且我第一次运行C#的速度慢了5倍,这真的很奇怪。片刻之后,我明白这是由于我运行C#app的调试模式。

要发布它非常接近(20秒节点,22秒C#),可能这只是测量不一致。

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

答案 2 :(得分:0)

问题目前缺乏关于基准的细节,因此不可能对此有任何明确的说法。但是,运行javascript的V8和从C源编译的bknary程序之间的一般比较是可能的。

V8JIT compilation非常擅长,所以虽然有JIT编译的开销,但这会补偿JavaScript的动态特性,所以对于循环中的简单整数运算,JIT没有理由代码要慢一些。 JIT

另一个考虑因素是启动时间。如果首先加载node.js并从交互式提示加载javascript,即使使用JIT,脚本的启动时间也是最小的,特别是与需要解析符号等的动态链接二进制文件相比。如果你有小的静态链接二进制文件,它将启动非常快,并且在新的node.js开始运行时开始执行大量处理并开始寻找一些Javascript来执行。您需要小心如何在基准测试中处理此问题,否则结果将毫无意义。