在我的双核机器上,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;
}
答案 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程序之间的一般比较是可能的。
V8在JIT compilation非常擅长,所以虽然有JIT编译的开销,但这会补偿JavaScript的动态特性,所以对于循环中的简单整数运算,JIT没有理由代码要慢一些。 JIT
另一个考虑因素是启动时间。如果首先加载node.js
并从交互式提示加载javascript,即使使用JIT,脚本的启动时间也是最小的,特别是与需要解析符号等的动态链接二进制文件相比。如果你有小的静态链接二进制文件,它将启动非常快,并且在新的node.js
开始运行时开始执行大量处理并开始寻找一些Javascript来执行。您需要小心如何在基准测试中处理此问题,否则结果将毫无意义。