我正在尝试加快与网络 worker 合作建立的javascript网站的速度。这对我来说是全新的,我正在学习。

我设法让这个网络 worker 运行并执行应做的事情(即加载一些CSV数据,对其进行转换并将其发送回去)。

但是在我看来,这个网络 worker 开始他的工作有点太晚了(我将postMessage发送给他后大约500毫秒)

这正常吗?
worker 怎么不早点开始呢?
我能做些什么 ?

这是 worker :

self.postMessage('A. !!! Worker on');
self.onmessage = function(event) {
    var n=event.data;
    self.postMessage('['+n+'] B. Worker started');
    // (...)
}

这是工作人员的处理方法:
window.timer = Date.now();
window.timerTotal = window.timer;

function loadData(n){
    console.log('A. !!! Begin loadData function (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();

    var worker = new Worker('my_task.js');
    worker.onmessage = function(event) {
        if ( (typeof event.data)==='string'){
            console.log('Web Worker: ' + event.data + ' (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();
        }
        else if ( (typeof event.data)==='object'){
            console.log('!!! Web Worker returned object: (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();
            createGraphs2(event.data);
        }
    };

    if(n===100){
        d3.csv("data/Movies100-V2.0.csv", function(error, data_csv) {
            createGraphs(data_csv);
        });
    }
    else if(n==='10k'){
        worker.postMessage(n);
    console.log('postMessage send to web worker (dt=' + (Date.now()-window.timer) + ') (T='+(Date.now()-window.timerTotal)+')'); window.timer = Date.now();
    }
}

loadData('10k');

// (...) lots of functions like createGraphs2(data)

这是日志:



谢谢!

更新:

当我启动VeryLongScript的同时向工作人员发送postMessage时:
veryLongScript();
worker.postMessage(n);

在大多数情况下,工作人员会在veryLongScript之后做出响应。



有时工作人员会在veryLongScript之前和之后做出响应,但似乎无法并行工作。

最佳答案

当您通过以下方式创建新工作人员时

new Worker('my_task.js');

仅在这一点上,浏览器才向服务器发出请求,要求my_task.js在工作程序中运行。然后,您正在等待服务器发出并返回请求,以及正在启动的工作程序。

我在http://plnkr.co/edit/MlabLs4HafnIscBbnPJv?p=preview上做了一个简化的代码示例。对我来说,它报告启动一个Chrome的 worker 大约需要130ms的时间。但是,网络检查器指出,获取脚本大约需要90毫秒。因此,为 worker 的实际启动时间留出40毫秒的时间。

我怀疑您报告的500毫秒中的大多数实际上是从服务器获取工作程序脚本所花费的时间。

我的建议是
  • 在页面加载时创建工作程序,而不仅仅是在您要使用它之前。 (尽管在页面加载时已经在使用它,但是在这里您无能为力)。请参阅http://plnkr.co/edit/cNltJvTbLxDr2FfaCuRf?p=preview,对于我来说,从现有工作人员获取/返回消息的时间大约为2毫秒。
  • 确保设置适当的HTTP header ,然后浏览器可以缓存Worker javascript文件。因此,除了第一次访问外,都避免了网络请求。
  • 如果访问者所在的页面通常不是访问者在您网站上看到的第一页,则可以稍作弊并在其他页面上加载该访问者,但不使用它。如果脚本具有适当的缓存头,则它将避免在页面上实际需要它的请求。

  • 或者,您可以避免将worker作为单独的文件,而将代码内联并将其转换为Data URI,如https://stackoverflow.com/a/6454685/1319998所述。 但是https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers所述



    因此,我会谨慎地在您要支持的浏览器上进行测试。

    关于javascript - 让网络 worker 尽快启动,刻不容缓,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30275218/

    10-13 08:29