将JS对象转换为ArrayBuffer以转移到Web worker或从Web worker转移等于瓶颈

时间:2016-09-13 07:07:16

标签: javascript multithreading web-worker

我有一个Web工作者,它不断计算大量数据,当完成一个回合是一个js对象,然后我解析为ArrayBuffer,然后将其发送到主线程。

无法对计算做很多事情,并且ArrayBuffer的传输速度很快。但是,解析此对象会降低该过程的速度。由于对象本身包含更多对象的数组。

在Firefox中,我收到以下警告:

A script on this page may be busy, or it may have stopped responding.
You can stop the script now, open the script in the debugger,
or let the script continue.

Script: http://localhost/js/util/DataViewSerializer.js:435

第435行指的是我序列化数组的函数。该行是声明for循环的地方。

DataViewSerializer.prototype.setArray = function (array, serializer) {
    var i,
        l = JSUtil.hasValue(array) ? array.length : 0;

    this.setUint32(l);

    console.log(array, serializer);
    for (i = 0; i < l; i += 1) {
        if (serializer !== undefined) {
            serializer.serializeTo(array[i], this);
        } else {
            array[i].serializeTo(this);
        }
    }
};

我在网络工作者和主要线程之间阅读Transferable Object。因为发送ArrayBuffers似乎是唯一的方法。

所以我的问题是,是否有更快的方法将js对象转换为ArrayBuffer?或者其他任何提高速度的建议?

1 个答案:

答案 0 :(得分:-5)

这个角色的问题已经在网络工作者中被问了3次。这两个是我用很长的答案回答的:

鉴于我已经写了很多文字,我只是重复主题:

  

除非结构化克隆算法不支持您的数据,否则不要使用自定义序列化来支持结构化克隆算法!

也就是说,只需致电:

worker.postMessage({name: "MY_MESSAGE", data:myArray});