写点什么

Web Worker 通信性能研究:通过多线程改进 Web 应用性能

  • 2019-08-19
  • 本文字数:1182 字

    阅读完需:约 4 分钟

Web Worker通信性能研究:通过多线程改进Web应用性能

Surma 是谷歌的 Web 布道师,最近发布了一项有关 postMessage 的性能研究结果。postMessage 是 Web Worker 的通信方式。Surma 的结论是,虽然 postMessage 会带来一些开销,但如果有效载荷低于给定的开销预算,那么将非 UI 任务移出主线线可能会提高总体性能。


超过一半的互联网接入来自手机或平板电脑,而低端多核移动设备的市场份额一直在增加,Web 应用程序开发人员必须确保应用程序在低配置的环境中(如慢 CPU、GPU 或小内存)也能具有高性能。


在这种情况下,使用多线程的 Web Worker 可以将与计算相关的负载从主执行线程中隔离出来。最终的性能是在原生多核心架构上并行化任务(如果可用)所带来的好处加上与线程间通信开销相关的成本的总和。对于 Web 应用程序来说,主要的通信开销是使用 postMessage 方法在主 UI 线程和 Web Worker 之间进行通信。


由于一些开发人员不愿使用 Web Worker, Surma 对 postMessage 的性能做了一些说明。Surma 解释了他的研究背后的缘由:


人们不会考虑使用 Web Worker,是因为他们担心 postMessage()的性能,所以这是值得研究的一件事情。


该研究包括两个基准。第一个基准测试分析了在线程之间发送消息所需的时间,并显示了它与所发送的对象的复杂性之间的正相关关系。


第一个基准测试分别在 2018 款 MacBook Pro 上的 Firefox、Safari 和 Chrome 上运行,在 Pixel 3XL 的 Chrome 上运行,在诺基亚 2 的 Chrome 上运行。对象复杂度是指表示对象的 JSON 树的深度(树的层次)和宽度(属性的数量)的组合。


第二个基准测试证实了与 JSON.stringify()返回的字符串长度的强正相关关系,不过带有一些警告。Surma 解释说:


我认为这种相关性足够强,我们可以从中得出一个法则:对象的字符串化 JSON 表示与它的传输时间大致成正比。但更重要的是,这种相关性只适用于大对象,我说的大对象是指超过 100KB 的对象。虽然这种相关性在数学上是成立的,但这种差异对于较小的有效载荷来说更为明显。


Surma 根据响应动画空闲加载(RAIL)指南给出了“慢”的定义,并对涉及 JS 驱动动画的上下文(显示下一帧的预算为 16ms)和不涉及上下文(响应用户交互的预算为 100ms)的情况进行了区分。


Surma 总结道:


即使在最慢的设备上,你也可以使用 postMessage()发送 100KB 的对象,并保持在 100ms 的响应预算之内。如果有 JS 驱动的动画,有效载荷达到 10KB 是没有问题的。对于大多数应用程序来说,这应该足够了。使用 postMessage()确实有一定的代价,但不至于会导致脱离主线程架构变得不可用。


对于 postMessage 成本超过在多个线程上运行任务的好处的情况,Surma 提供了替代方案,比如通过使用分块技术或 WebAssembly 来提升性能。


完整的研究结果可以在 Surma 的博客上找到,其中包含了数据、可视化演示和图表。


原文链接


Improving Webapp Performance With Multi-Threading: A Study of Web Workers’ Communication Overhead


2019-08-19 08:007873
用户头像

发布了 731 篇内容, 共 483.3 次阅读, 收获喜欢 2008 次。

关注

评论

发布
暂无评论
发现更多内容

从字节码探索代理模式

4ye

Java 后端 字节码 代理模式 8月日更

浪潮云IBP机器学习平台通过中国信通院可信云评估 荣获“先进级”认证

云计算

手撸二叉树之从根到叶的二进制数之和

HelloWorld杰少

数据结构与算法 8月日更

浅谈在探索数分之路上“数据思维”培养

小飞象@木木自由

数据分析 数据思维

富文本及编辑器的跨平台方案

vivo互联网技术

跨平台 编辑器 富文本

Python代码阅读(第11篇):展开嵌套列表

Felix

Python 编程 Code Programing 阅读代码

Java双刃剑之Unsafe类详解

码农参上

Java unsafe 8月日更

计算机字符编码的前世今生

vivo互联网技术

Unicode utf-8 编码 ASCII 字符集

kafka - 基础介绍

旺仔大菜包

kafka

JavaScript 的 null 和 undefined 判断

HoneyMoose

后Kubernetes时代的虚拟机管理技术之Virtual-Kubelet篇

谐云

k8s 虚拟机

高可用架构演进之单元化

华为云开发者联盟

物联网 IoT 华为云

基于昇腾CANN的卡通图像生成可在线体验啦!十分钟带你了解CANN应用开发全流程

华为云开发者联盟

ai框架 CANN 昇腾 昇腾AI应用 图像生成

又翻车了?列表点击事件采集那些你不知道的坑!

神策技术社区

数据库 大前端 后端 代码

也许你曾对怎么样才算认真做事情感到好奇,这本书给我三个启发,我想与你分享。

叶小鍵

架构训练营模块5-作业

sophiahuxh

【Vue2.x 源码学习】第三十八篇 - 组件部分 - 组件的编译

Brave

源码 vue2 8月日更

Regan Yue带你一起学习微软AZ-900认证的有关知识「 第Ⅲ章」

Regan Yue

云计算 微软 8月日更

架构实战营模块五作业 -微博评论高性能高可用架构

hello

架构训练营

什么是强化学习?

华为云开发者联盟

机器学习 强化学习 智能体 环境 动作空间

索信达控股: 银行对公业务数字化营销进阶攻略

索信达控股

【Flutter 专题】65 图解基本 TextField 文本输入框 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

vue入门:组件概述

小鲍侃java

8月日更

从0搭建在线聊天室,只需4步!

网易云信

细数浅拷贝和深拷贝

苹果看辽宁体育

Java 后端

Compose 列表

Changing Lin

8月日更

Rust从0到1-高级特性-不安全的Rust

rust unsafe 高级特性 不安全

JVM集合之开篇点题

阿Q说代码

JVM hotspot 8月日更 栈式架构 寄存器架构

Pulsar Manager - Use Docker

ZHOUWEI

Apache Pulsar

SpringBoot dockerfile生成镜像

Rubble

8月日更

Nginx可观测最佳实践分享,一篇文章带你快速入门!

观测云

nginx 云计算

Web Worker通信性能研究:通过多线程改进Web应用性能_移动_Bruno Couriol_InfoQ精选文章