【问题标题】:Is a Web Worker faster than running a script?Web Worker 是否比运行脚本更快?
【发布时间】:2016-11-02 14:24:53
【问题描述】:

我的任务是在每个页面上创建一个专用的 webworker 实例,以在给定的时间间隔内处理发送服务器请求,而不管用户在哪个页面上。由于这必须适用于任何浏览器,因此不能选择共享网络工作者(因此必须为每个页面加载它)。

我创建了一个脚本,以为我一直在创建一个 worker,但最近我被告知实际上并没有创建 worker,尽管该脚本正在执行 webworker 的预期功能。

webworker 的基本功能是这样的:

onPageLoad {

    function sendHeartbeat() {
        sendRequest(URL);
    }

    function startHeartbeat() {
        if(timeToSendHeartbeat) {
             sendHeartbeat();
        } else {
             setInterval(timeRemaining, sendHeartbeat());
        }
    }
}

这让我开始思考使用网络工作者是否是最佳选择。使用我缺少的网络工作者是否有一些固有的优势?使用网络工作者是否比将脚本附加到每个页面并按原样运行效率更高?还是这个应用程序不适合网络工作者?

【问题讨论】:

    标签: javascript performance web-worker


    【解决方案1】:

    WebWorkers 只是运行脚本,因此它们不会比其他方法更快。它们通过在不同的线程中运行而不阻塞 UI 或任何其他想要在主线程中运行的代码而大放异彩。

    真正的决定因素是要进行工作程序化的代码是否运行足够长的时间以导致应用程序的其余部分出现问题。如果您有需要按时触发的间隔或非常长时间运行的数学运算,您可能需要启动一个工作程序并让它运行一段时间,然后在最后获取结果。

    就主线程而言,worker 和 API 调用在原则上并没有完全不同。您正在派其他人去做工作并在他们完成后收集结果。无论是发生在服务器上还是其他线程上都不太重要,要关注的部分是主线程没有在做这项工作。

    【讨论】:

    • 用户不太可能在页面上停留完整的时间间隔,因此大多数情况下,脚本或工作人员会根据时间确定何时需要发送下一个请求,因为最后一个已发送。这会让工人没有优势吗?
    • 如果你的工作(心跳 ping,这里)已经是异步的或者非常快,worker 不会有太大变化。浏览器的调度程序应该可以很好地处理它。
    • 确实调用 localStorage 以获取最后一次心跳 ping 的时间,但我相信这是它所做的计算成本最高的事情。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多