あ?asm.js全然はやくない。

asm.jsの存在意義とはいったい…

function mod(stdlib, foreign, heap)
{
    "use asm";

    var FLOAT64 = new stdlib.Float64Array(heap);
    var INT32 = new stdlib.Float64Array(heap);

    function run(i0, i1, size)
    {
        i0 = i0 | 0;
        i1 = i1 | 0;
        size = size | 0;
        var i = 0;
        var v0 = 0.0;
        var v1 = 0.0;

        var idx0 = 0;
        var idx1 = 0;

        idx0 = 0;
        idx1 = 0;

        for (i=0; (i|0) <= (size|0); i=(i+1)|0) {
            v0 = +FLOAT64[((i*8|0+i0)|0)>>3];
            v1 = +FLOAT64[((i*8|0+i1)|0)>>3];

            FLOAT64[((i*8|0+i0)|0)>>3] = v0 * v1 + v1;
        }
    }

    function hoge() {
        var i = 0;
        var x = 0.0;
        var sz = 0;

        sz = 1000*128|0;

        for (i=0;
             (i|0) <= (sz|0);
             i=(i+1)|0)
        {
            run(0, 1000, 1000);
        }
    }

    return {
    hoge:hoge
    };
}

var heap = new ArrayBuffer(4096*8);
var foreign = new ArrayBuffer(4096*8);

m = mod(window, foreign, heap);

function jsrun(FLOAT64, i0, i1, size)
{
    for (var i=0; i<size ; i++) {
        var v0 = FLOAT64[i0+i];
        var v1 = FLOAT64[i1+i];

        FLOAT64[i0+i] = v0*v1 + v1;
    }
}

function jshoge()
{
    var FLOAT64 = new Float64Array(heap);

    for (var i=0; i<1000*128; i++) {
        jsrun(FLOAT64, 0, 1000, 1000);
    }
}

function vecadd()
{
    console.time('js');
    jshoge();
    console.timeEnd('js');


    console.time('asm');
    m.hoge();
    console.timeEnd('asm');

}
firefox nightly
js: timer started
js: 245.31ms
asm: timer started
asm: 276.43ms


chrome
js: 650.000ms
asm: 921.000ms

Cで↓みたいに書いたら 216msec

#include <stdio.h>
#include <windows.h>

typedef double array_type;

#define SIZE (4096*8)

array_type FLOAT64[SIZE];

static array_type
load(array_type *p, int idx)
{
    if (idx < SIZE) {
        return p[idx];
    }

    return 0;
}

static void
store(array_type *p, int idx, array_type val)
{
    if (idx < SIZE) {
        p[idx] = val;
    }

}

static __attribute__((noinline,noclone)) void
run(array_type *FLOAT64,
    int start, int end, int size)
{
    int i;
    for (i=0; i<size; i++) {
        store(FLOAT64, start+i,
              load(FLOAT64, start+i)*load(FLOAT64, end+i) + load(FLOAT64, start+i));
    }
}

static __attribute__((noinline,noclone)) void
hoge(array_type *FLOAT64)
{
    int sz = 1000*128;
    int i;

    for (i=0; i<sz; i++) {
        run(FLOAT64, 0, 1000, 1000);
    }
}

int main()
{
    int s, e;

    timeGetTime();

    hoge(FLOAT64);


    s = timeGetTime();
    hoge(FLOAT64);
    e = timeGetTime();

    printf("%d\n", e-s);
}

chrome は謎くて

function jsrun(FLOAT64, i0, i1, size)
{
    for (var i=0; i<size ; i++) {
        var v0 = FLOAT64[i0+i];
        var v1 = FLOAT64[i1+i];

        // FLOAT64[i0+i] = v0*v1;   // 224ms
        FLOAT64[i0+i] = v0*v1 + v1; // 658ms
    }
}

まーこういう謎なことが起こらないことを保証してると思えばいいのか。