节点js与C的比较

在我的双核机器上,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; } 

你是一个玩具程序的基准,这不是比较编译器的好方法。 此外,你正在做的循环没有副作用。 它所做的就是将i设置为n * n 。 应该优化循环。 你运行未优化?

尝试计算一个真实的近似于稍后在生产中应用的工作负载。 如果你的代码在数值上是很重的,你可以用一个简单的matrix乘法作为例子。

所有的基本操作(+ – ,Math.xx等)被映射到V8引擎,它只是作为C程序来执行它。 所以在这种情况下,你应该对C和Node.js有相同的结果。

此外,我已经尝试了C#.NET与节点的Fibonacci 45.我第一次运行它是慢了5倍的C#,这真的很奇怪。 在一瞬间,我明白,这是由于debugging模式,我运行C#应用程序。

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

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

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

V8在JIT编译上相当不错,所以虽然有JIT编译的开销,但是这补偿了JavaScript的dynamic性,所以对于循环中的简单整数操作,没有理由使JIT代码变慢。 JIT

另一个考虑是启动时间。 如果首先加载node.js并从交互式提示符加载JavaScript,则即使使用JIT,脚本的启动时间也是最小的,特别是与需要parsing符号的dynamic链接二进制代码相比较。如果有小的静态链接二进制代码,它将以非常快的速度启动,并且在一个新的node.js甚至启动并开始寻找一些Javascript来执行的时候,会做很多的处理。 你需要小心如何在基准testing中处理这个问题,否则结果将毫无意义。