目标:斐波那契数列 前30位 循环100万次
位数多了,大数的话,JS还是C代码写起来很麻烦,嗯,更别说汇编了
代码:
function jstest(){
var time = new Date();
var a,b,res;
for(var t =0;t<1000000;t++) {
a = 0;
b = 1;
for (var i = 0; i < 30; i++) {
res = a + b;
a = b;
b = res;
}
}
console.log("value is:",res);
time = new Date().getTime() - time.getTime();
console.log('js',time+'ms');
}
function addon(){
var time = new Date();
x.fib();
time = new Date().getTime() - time.getTime();
console.log('addon c++',time+'ms');
}
function assb(){
var time = new Date();
x.assb();
time = new Date().getTime() - time.getTime();
console.log('addon c++ / inline asm',time+'ms');
}
jstest();
addon();
assb();
c++
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
long a,b,c;
for(int i=0;i<1000000;i++ ){
a = 0;
b = 1;
for(int t=0;t<30;t++){
c=a+b;
a = b;
b = c;
}
}
std::cout<<"value is: "<<c<<std::endl;
c++ inline asm
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
int b;
__asm__ __volatile__(
"movl $100000, %%edi\n\t"
"jmp .L2\n\t"
".L3:\n\t"
"movq %%rdx, %%rcx\n\t"
"movq %%rsi, %%rdx\n\t"
".L5:\n\t"
"leaq (%%rcx,%%rdx), %%rsi\n\t"
"subl $1, %%eax\n\t"
"jne .L3\n\t"
"subl $1, %%edi\n\t"
"je .L7\n\t"
".L2:\n\t"
"movl $30, %%eax\n\t"
"movl $1, %%edx\n\t"
"movl $1, %%ecx\n\t"
"jmp .L5\n\t"
".L7:\n\t"
"movq %%rdx,%%rax\n\t"
"movl %%eax,%0\n\t"
:"=a" (b)
);
std::cout<<"value is: "<<b<<std::endl;
结果
value is: 1346269 js 115ms value is: 1346269 addon c++ 31ms value is: 1346269 addon c++ / inline asm 3ms
配置
Intel® Xeon® CPU E5-2430 0 @ 2.20GHz -单核 512MB 阿里云
后话
我开始自己写了LOOP体汇编。居然跟JS的性能差不多!后来直接反编译C。得到了上面的性能代码,瀑布汗。 可挑战CPU密集型业务。
瓜皮威武,我爱瓜皮。
观光团前来给瓜皮点赞
瓜神威武,我爱瓜神。
cout
效率被 printf
甩 N 条街,你还别不信。
顺便,“Node.js 不适合做任务密集型计算”的原因并不是效率太低。
被解释的动态语言效率跟 C++ 比都不会太好。
它不适合做计算密集型计算的原因是单进程单线程。
如果你只把它当一个单进程单线程的 C 程序来看待的话,并不会不适合。所谓不适合是在并发的网络请求下,一次阻塞会影响到别的请求,这才是“不适合做计算密集型任务”的真正原因。
就算你用 C 用 ASM 优化了,这一点还是不改变的,撸主不要被混淆了。
你可以尝试用 cluster-worker 模型等。
好流弊,对开始用汇编写应用了。。。
@xadillax 就是因为解释型语言的关系,CLUSTER大家都有在用啦。CPU密集型业务的瓶颈的确在性能啦。
简直炫酷,这就是那个CreatJS的作者瓜皮吗? 卧槽!一看还真是!!!! 尼玛今天逛论坛赚大发了!居然碰上瓜皮!!! 我的Node生涯有救了!!
@captainblue2013 蓝神你能加了我微信再夸我吗
此 Cluster 用途非彼 Cluster 用途。
@xadillax fibjs类似的底层CLUSTER?
@MiguelValentine 你们说的 cluster 可是一个 web 应用开个 cluster 然后内核数个 worker 负载均衡?
瓜皮威武, 我爱瓜皮
瓜皮神教,一统江湖
很好奇,不知道java 需要多少时间!?
@MiguelValentine 我也想加你微信,我的未来有救了
来自炫酷的 CNodeMD
@monolyvip Avivo1
虽然不知道你们在说什么,但是还是觉得瓜皮很厉害