精华 NODE / NODE C++ / NODE C++ INLINE ASM 性能大测试!
发布于 5 年前 作者 MiguelValentine 4842 次浏览 最后一次编辑是 4 年前 来自 分享

目标:斐波那契数列 前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密集型业务。

17 回复

瓜皮威武,我爱瓜皮。

观光团前来给瓜皮点赞

瓜神威武,我爱瓜神。

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

虽然不知道你们在说什么,但是还是觉得瓜皮很厉害

回到顶部