本周再来翻译一些技术文章,本次预计翻译三篇文章如下:

我翻译的技术文章都放在一个github仓库中,如果觉得有用请点击star收藏。我为什么要创建这个git仓库?目的是通过翻译国外的web相关的技术文章来学习和跟进web发展的新思想和新技术。git仓库地址:https://github.com/yzsunlei/javascript-article-translate

用户将大部分的网络在线时间花费在移动设备上,其余的大部分是使用不受限制的便携式计算机。对于两者而言,电池寿命都是至关重要的。在这篇文章中,我们将讨论影响电池寿命的因素,以及你作为一名Web开发人员如何使你的页面更节能,以便用户可以花更多时间与你的内容互动。

什么消耗电量?

移动设备上的大部分电量由这几个主要组件消耗:

  • CPU(主处理器)
  • GPU(图形处理)
  • 联网(Wi-Fi和蜂窝无线芯片)
  • 屏幕

屏幕功耗相对恒定,并且大多在用户的控制下(通过屏幕的开启时间和亮度),但是其他组件(CPU,GPU和网络硬件)在功耗方面具有很高的动态范围。

系统会根据当前正在处理的任务来调整CPU和GPU的性能,这些任务当然包括渲染用户正在使用其Web浏览器和其他使用Web内容的应用程序与之交互的网页。这可以通过打开或关闭某些组件并更改其时钟频率来完成。广义上讲,芯片要求的性能越高,其功率效率就越低。硬件可以非常快速地提升到高性能(但是要付出很高的功耗),然后可以迅速返回到更有效的低功耗状态。

良好用电的一般原则

因此,为了最大程度地延长电池寿命,你需要减少在高功率状态下花费的时间,并使硬件尽可能多地回到空闲状态。

对于Web开发人员,需要考虑三种交互状态:

  • 用户正在与内容进行交互时。
  • 当页面位于最前面,但未与之交互时。
  • 页面不是最前面的内容时。

高效的用户互动

显然,在用户与页面进行交互时消耗电量是很正常的。你希望页面快速加载并快速响应触摸交互。在许多情况下,减少首次渲染时间和与用户互动的时间的相同优化也将减少功耗。但是,对于在初始页面加载后继续加载资源和运行脚本要谨慎。目标应该是尽快回到空闲状态。通常,运行的JavaScript越少,页面的效率就越高,因为脚本是在浏览器已经完成的布局和绘制页面的基础上工作的。

页面加载完成后,诸如滚动和点击之类的用户交互也将增加硬件功耗(主要是CPU和GPU),这再次有意义,但是请确保在用户停止交互后立即回到空闲状态。另外,请尝试停留在浏览器的“快速路径”上-例如,内置的页面滚动将比JavaScript中实现的自定义滚动更加节能。

将闲置电源使用率降至零

当用户不与页面交互时,请尝试使页面使用尽可能少的电量。例如:

尽量减少使用计时器,以免唤醒CPU。尝试将基于计时器的工作合并为几个不经常使用的计时器。许多不协调的计时器会频繁的触发CPU唤醒,这比将工作收集成更少的块要糟糕得多。

尽量减少动画内容,例如动画图像和自动播放的视频。特别要避免“加载”GIF或CSS动画,这些GIF或CSS动画会不断触发绘制,即使你看不到它们也是如此。IntersectionObserver用于仅可在可见时运行动画。

尽可能使用声明性动画(CSS Animations和Transitions)。当动画内容不可见时,浏览器可以优化这些内容,并且它们比脚本驱动的动画更有效。

避免进行网络轮询以从服务器获取定期更新。推荐使用具有持久连接的WebSockets或Fetch,而不是轮询。

在应处于空闲状态时正在工作的页面也将对用户交互的响应降低,因此将后台活动最小化也可以提高响应速度和电池寿命。

后台时CPU使用率为零

在多种情况下,页面变为非活动状态(不是用户的焦点时),例如:

  • 用户切换到其他选项卡。
  • 用户切换到其他应用程序。
  • 浏览器窗口最小化。
  • 浏览器窗口是可见的,但不是焦点窗口。
  • 浏览器窗口在另一个窗口后面。
  • 窗口所在的空间不是当前空间。

当页面变为非活动状态时,WebKit会自动采取动作来节省电量:

  • requestAnimationFrame 已停止。
  • CSS和SVG动画已暂停。
  • 计时器受到限制。

另外,WebKit会利用操作系统提供的功能来最大化效率:

  • 在iOS上,如果可能,选项卡将完全挂起。
  • 在macOS上,标签页会进入App Nap,这意味着未进行视觉更新的标签页的Web进程的优先级较低,并且计时器受到限制。

但是,页面可以通过计时器(setTimeout和setInterval),消息,网络事件等触发CPU唤醒。在后台时,应尽可能避免这些事件。有两个对此有用的API:

  • Page Visibility API提供了一种方法来响应页面转换为后台还是前台。这是避免在页面处于后台时更新UI的好方法,然后在页面可见时使用visibilitychange事件来更新内容。
  • blur每当页面不再处理焦点时,都会触发事件。在这种情况下,页面可能仍然可见,但不是当前聚焦的窗口。根据页面的不同,停止动画可能是一个好主意。

查找问题的最简单方法是Web Inspector的时间轴。该记录不应显示页面在后台时发生的任何事件。

降低网页耗电

既然我们知道了网页耗电的主要原因,并给出了一些有关创建节能网页的一般规则,那么让我们来谈谈如何识别和修复导致耗电量过多的问题。

脚本

如上所述,现代CPU可以将设备闲置时的耗电量从非常低的坡度提高到非常高的水平,以满足用户交互和其他任务的需求。因此,CPU成为电池寿命变化的主要原因。页面加载期间的CPU使用率是浏览器引擎在加载,解析和渲染资源以及执行JavaScript时所做的工作的组合。在许多最新浏览器的网页上,执行JavaScript所花费的时间远远超过了浏览器在其余加载过程中所花费的时间,因此,最小化JavaScript执行时间将最大程度地降低功耗。

衡量CPU使用率的最佳方法是使用Web Inspector。如我们在上一篇文章中所示,时间轴可以显示任何选定时间范围内的CPU活动:

为了有效地使用CPU,WebKit在可能的情况下将工作分配到多个内核上(使用Workers的页面也将能够使用多个内核)。Web Inspector提供了与页面主线程同时运行的线程的细分。例如,以下屏幕截图显示了滚动具有复杂渲染和视频播放功能的页面时的线程:

在寻找要优化的东西时,请专注于主线程,因为那是你的JavaScript运行的地方(除非你使用的是Workers),然后使用“JavaScript And Event”时间轴来了解触发脚本的原因。也许你在响应用户或滚动事件方面做了太多工作,或者触发了requestAnimationFrame中隐藏元素的更新。了解页面上使用的JavaScript库和第三方脚本所完成的工作。要进行更深入的研究,可以使用Web Inspector的JavaScript探查器来查看在哪里花费时间。

“WebKit线程”中的活动主要是由与JavaScript相关的工作触发的:JIT编译和垃圾回收,因此减少运行的脚本数量并减少JavaScript对象的创建和销毁可以降低这种情况。

WebKit调用的其他各种系统框架都使用线程,因此“其他线程”包括那些线程完成的工作;绘画是“其他线程”活动中使用最多的,接下来我们将讨论绘画。

绘画

主线程CPU使用率也可以由大量布局和绘画触发;这些通常是由脚本触发,但比其他属性的CSS动画transform,opacity并且filter还可能导致他们触发。查看“Layout and Rendering”时间轴将帮助你了解导致触发活动的原因。

如果“Layout and Rendering”时间轴显示绘画,但你无法确定正在发生的变化,请启用“Paint Flashing”:

这将使这些绘画用红色标记突出显示。你可能需要滚动页面才能看到它们。请注意,WebKit会保留一些“过度绘制(overdraw)”的图块,以实现平滑的滚动,因此在视口中不可见的绘制仍可以继续工作,以使屏幕外的图块保持最新状态。如果时间轴上显示绘画,则说明它在做实际的工作。

除了导致CPU耗电外,绘画通常还会触发GPU工作。macOS和iOS上的WebKit使用GPU进行绘画,因此触发绘画可能会导致功耗显着增加。额外的CPU使用率通常会显示在CPU使用率时间轴的“其他线程”下。

GPU还用于2D画布和WebGL/WebGPU。为了最大程度地减少绘图,如果画布内容没有更改,请不要调用API,并尝试优化画布绘图命令。

许多Mac笔记本电脑有两个GPU,一个与CPU在同一个芯片上的“集成”GPU,功能不强但功耗更高,还有一个功能更强大但功耗更高的“独立”GPU。WebKit默认情况下将使用集成GPU。你可以使用powerPreference上下文创建参数请求独立GPU ,但是只有在你可以证明功耗成本合理的情况下,才可以这样做。

网络

无线网络会以你意想不到的方式影响电池寿命。手机受到的影响最大,因为它们结合了功能强大的射频(WiFi和蜂窝网络芯片)和较小的电池。不幸的是,在实验室之外测量网络的电源影响并不容易,但是可以通过遵循一些简单的规则来减少能耗。

减少网络能耗的最直接方法是最大限度地利用浏览器的缓存。减少页面加载时间的所有最佳实践还通过减少无线电的开机时间而使电池受益。

另一个重要方法是将网络请求组合在一起。每当有新请求出现时,操作系统就需要打开无线电,连接到基站或蜂窝塔并传输字节。传输完数据包后,如果需要继续传输更多数据包,无线电将保持少量供电。

如果页面频繁地传输少量数据,则开销可能大于传输数据所需的能量:

传输2个数据包之间有延迟的网络功率开销,可以从“Network Requests”时间线中的Web检查器中发现此类问题。例如,以下屏幕截图显示了在几秒钟内发送的四个单独的请求(可能是分析):

同时发送所有请求将提高网络用电效率。

结论

网页可以成为电池寿命的好公民。

衡量Web Inspector中的电池影响并降低这些能耗很重要。这样做可以改善用户体验并且延长电池寿命。

延长电池寿命的最直接方法是最大程度地减少CPU使用率。新的Web Inspector提供了一种可以随时间进行监视的工具。

为了达到更长的电池寿命,目标是:

  • 空闲时将CPU使用率降至零
  • 在用户交互过程中最大化性能,以快速恢复闲置状态

原文链接:https://webkit.org/blog/8970/how-web-content-can-affect-power-usage/

[技术翻译]Web网页内容是如何影响电池使用寿命的?的更多相关文章

  1. [技术翻译]使用Nuxt生成静态网站

    本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...

  2. [技术翻译]在现代JavaScript中编写异步任务

    本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...

  3. 20145214 《网络对抗技术》 Web安全基础实践

    20145214 <网络对抗技术> Web安全基础实践 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的 ...

  4. 20145226夏艺华 网络对抗技术EXP8 WEB基础实践

    20145226夏艺华 网络对抗技术EXP8 WEB基础实践 实验问题回答 1.什么是表单? 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CG ...

  5. 20145311王亦徐 《网络对抗技术》 Web安全基础实践

    2014531王亦徐 <网络对抗技术> Web安全基础实践 实验内容 利用WebGoat平台尝试了一些XSS.CSRF.SQL注入攻击 基础问题回答 1.SQL注入攻击原理,如何防御原理: ...

  6. 20145325张梓靖 《网络对抗技术》 Web安全基础实践

    20145325张梓靖 <网络对抗技术> Web安全基础实践 实验内容 使用webgoat进行XSS攻击.CSRF攻击.SQL注入 XSS攻击:Stored XSS Attacks.Ref ...

  7. 20145337《网络对抗技术》Web安全基础实践

    20145337<网络对抗技术>Web安全基础实践 一.实验后回答问题 1.SQL注入攻击原理,如何防御 SQL注入攻击的本质是利用SQL语法,针对应用程序开发过程中的漏洞,从一个数据库获 ...

  8. 2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础

    2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础 1.基础问题 SQL注入攻击原理,如何防御 原理: SQL注入指攻击者在提交查询请求时将SQL语句插入到请求内容中,同 ...

  9. 以正确的方式开源 Python 项目 - 技术翻译 - 开源中国社区

    以正确的方式开源 Python 项目 - 技术翻译 - 开源中国社区 以正确的方式开源 Python 项目 英文原文:Open Sourcing a Python Project the Right ...

随机推荐

  1. 开源中国 2014 最受关注开源软件排行榜 TOP 50

    开源中国 2014 最受关注开源软件排行榜 TOP 50 开源中国 2014 年最受关注软件排行榜 TOP 50 正式出炉!2014 年结束了,我们来了解一下过去一年里开源中国最受欢迎的 50 款软件 ...

  2. Project Euler Problem 12-Highly divisible triangular number

    最直接的想法就是暴力搞搞,直接枚举,暴力分解因子.再好一点,就打个素数表来分解因子.假设num=p1^a1p2^a2...pn^an,则所有因子个数为(a1+1)(a2+1)...(an+1). 再好 ...

  3. 【tensorflow】】模型优化(一)指数衰减学习率

    指数衰减学习率是先使用较大的学习率来快速得到一个较优的解,然后随着迭代的继续,逐步减小学习率,使得模型在训练后期更加稳定.在训练神经网络时,需要设置学习率(learning rate)控制参数的更新速 ...

  4. vue 项目编译打包

    1. npm run build 2. npm install -g serve 3.serve dist 原文地址:https://www.cnblogs.com/jy13638593346/p/9 ...

  5. SuperSocket 服务管理器 (ServerManager)

    什么 SuperSocket 服务管理器? SuperSocket 服务管理器是一个让你能够在客户中用图形化界面来管理和监控你的SuperSocket服务器程序的组件. 在服务器端配置服务器管理器 事 ...

  6. supersocket为动态命令增加命令过滤器

    由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行 ...

  7. Laravel 修改默认日志文件名称和位置

    修改默认日志位置 我们平常的开发中可能一直把laravel的日志文件放在默认位置不会有什么影响,但如果我们的项目上线时是全量部署,每次部署都是git中最新的代码,那这个时候每次都会清空我们的日志,显示 ...

  8. pytorch中squeeze()和unsqueeze()函数介绍

    一.unsqueeze()函数 1. 首先初始化一个a 可以看出a的维度为(2,3) 2. 在第二维增加一个维度,使其维度变为(2,1,3) 可以看出a的维度已经变为(2,1,3)了,同样如果需要在倒 ...

  9. 纯JS前端分页方法(JS分页)

    1.JS分页函数:开发过程中,分页功能一般是后台提供接口,前端只要传page(当前页码)和pageSize(每页最大显示条数)及对应的其他查询条件,就可以返回所需分页显示的数据. 但是有时也需要前端本 ...

  10. tf.squeeze()

    转载自:https://www.cnblogs.com/mdumpling/p/8053376.html 原型 tf.squeeze(input, squeeze_dims=None, name=No ...