使用asm.js减慢数字处理速度

时间:2015-02-24 12:25:53

标签: javascript performance asm.js

我之前做了几次我称之为纯JavaScript的等离子演示:

enter image description here

jsFiddle

这个想法是使用2个振荡器(LFO),它们的频率+相位由两个振荡器驱动。然后我们用这两个主振荡器输出来决定每个点的r,g,b。

为了测试相当新的API asm.js,我已将其移植到完全“键入”状态'并完全记忆隔离。

我遇到的一个大问题是使用asm.js比使用普通JavaScript更慢。更糟糕的是:当我发表评论时,请使用asm'让浏览器解释代码,我得到比编译成功时更好的结果(快30%)。

我使用的内存是:

  1. 画布大小的字节数组:这是我在画布上putImageData的输出。
  2. 我认为我有一个float数组,用于存储LFO的值(基数/幅度/频率/相位),用于6 LFO。
  3. 我已经制作了两个版本,一个是fp32,另一个是fp64,其中没有一个是快速的(当普通对象版本大约20ms时,每帧<50毫秒)。

    请务必使用能够理解asm.js的浏览器,Firefox就是其中之一。

    jsFiddle

    jsFiddle

    经过实验,花了很多时间来评估LFO值:

    function oscillatorValueAt(heap_f64_Index, x) {
        heap_f64_Index = heap_f64_Index | 0;
        x = +x;
        var base = 0.0,
            amp = 0.0,
            freq = 0.0,
            phase = 0.0;
    
        heap_f64_Index = heap_f64_Index << 3;
        base = +heap_f64[(heap_f64_Index + 0) >> 3];
        amp = +heap_f64[(heap_f64_Index + 8) >> 3];
        freq = +heap_f64[(heap_f64_Index + 16) >> 3];
        phase = +heap_f64[(heap_f64_Index + 24) >> 3];
        return  +(base + amp * sin(freq * x + phase));
    }
    

    在tickPixels子中,每个像素调用几次,调用如下:

    vaty = +oscillatorValueAt(osc1, yD);
    

    你能帮助我找出为什么没有提速吗?

0 个答案:

没有答案