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

jus*_*ser 6 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
Run Code Online (Sandbox Code Playgroud)

第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);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我正在阅读Web worker和主线程之间的Transferable Object.因为发送ArrayBuffers似乎是唯一的方法.

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

Tom*_*ica -12

这种性质的问题已经在网络工作者中被问过大约 3 次了。我用很长的答案回答了这两个问题:

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

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

也就是说,只需调用:

worker.postMessage({name: "MY_MESSAGE", data:myArray});
Run Code Online (Sandbox Code Playgroud)