Web页面如此耗电!到了某种程度,会是大损失
myzbx 2025-05-09 20:33 46 浏览
现在用户上网大多使用移动设备或者笔记本电脑。对这两者来说,电池寿命都很重要。在这篇文章里,我们将讨论影响电池寿命的因素,以及作为一个web开发者,我们如何让网页耗电更少,以便用户有更多时间来关注我们的内容。
是什么在耗电?
移动设备的电力消耗有以下几个因素:
- CPU (核心处理器)
- GPU (图形处理)
- 网络 (wifi或者蜂窝移动网络)
- 屏幕
屏幕功耗相对稳定,并且主要由用户控制(通过屏幕使用时间和亮度),但是对于其他组件,例如CPU,GPU,网络模块,功耗是动态变化的,而且变化范围很大。
系统根据当前正在处理的任务调整CPU和GPU性能,包括在Web浏览器中用户正在交互的网页以及使用Web内容的其他应用程序。这是通过打开或关闭某些组件以及通过更改其时钟频率来完成的。总的来说,芯片所需的性能越高,其功率效率就越低。硬件可以非常快速地提升到高性能(但是需要很大的功率),然后迅速恢复到更高效的低功耗状态。
良好用电的一般原则
为了最大限度地延长电池寿命,你必须尽量减少硬件处于高功率状态的时间,让硬件尽可能的处于空闲状态。
对于web开发者来说,有三种交互场景需要注意:
- 用户主动与内容交互
- 页面处于前台,但是用户没有交互
- 页面处于后台
高效的用户交互
用户交互的时候肯定会耗电。页面需要快速的加载,并且能够快速的响应触摸。在大多数场景中,减少首次渲染时间也会降低功耗。不过,在初始页面加载后继续加载资源和运行脚本时要小心。我们要尽快让系统返回空闲状态。总的来说,浏览器已经完成了布局和渲染,js执行的越少,耗电越少。
一旦页面加载完,用户可能会滚屏或者点击页面,这同样会产生耗电(主要是CPU和GPU),这是必要的消耗。要确保尽快返回空闲状态。并且,最好使用浏览器本身提供的功能。- 举例:普通的页面滚动肯定比用js自定义的滚动更高效。
让空闲状态耗电趋向于零
当用户没有和页面交互时,尽可能的使页面不耗电,例如:
- 尽量少用定时器以避免唤醒CPU,可以把基于定时器的任务合并,使用尽可能少的定时器。大量滥用定时器会导致CPU被频繁唤醒,这比把这些任务合并处理要糟糕的多。
- 最大限度地减少动画内容,如动画图像和自动播放视频。要特别注意"loading"用的gif图片或css动画,这些动画会不断触发渲染,即使看不到也会触发。IntersectionObserver可以用来在可见时才运行动画。
- 尽量用css做动画和过渡,这些动画不可见时,浏览器会进行优化,并且css动画比js动画要高效的多。
- 避免通过轮询来获取服务器更新,可以用websocket或者持久连接来代替轮询。
看起来处于空闲状态的页面,如果正在后台进行工作,其用户交互的响应效率也会降低,因此最小化后台活动也可以提高响应能力以及电池寿命。
页面在后台时CPU零使用
这几种场景时,页面变为非活动状态(不是用户的首要焦点),例如:
- 用户切换到其他tab
- 用户切换到其他app
- 浏览器窗口最小化
- 浏览器窗口失去焦点
- 浏览器窗口在其他窗口后面
- 窗口所在的空间不是当前空间(MacOS才有空间的概念)
当页面不活动时,webkit会自动做以下处理来减少耗电:
- 停止调用requestAnimationFrame
- CSS和SVG动画会暂停
- 定时器会节流
此外,WebKit利用操作系统提供的能力来最大限度地提高效率:
- 在iOS上,不用的选项卡(tab页)会完全暂停。
- 在macOS上,选项卡会响应App Nap功能,这意味着不可视更新的选项卡的Web进程优先级较低,并且其计时器会做节流处理。
但是,页面可以通过计时器(setTimeout和setInterval),消息,网络事件等触发CPU唤醒。页面在后台时应避免这些唤醒,有两个API对此有用:
- 页面可见性API提供了一种响应页面转换为后台或前台的方法。这是一种避免页面在后台时更新UI的好方法。用visibilitychange事件,在页面可见时更新页面内容。
- 页面失去焦点时会发出blur事件。这时,页面依然可见,但是不是聚焦窗口。可以考虑暂停动画。
查找问题最简单的方式就是用浏览器控制台的时间线功能。页面在后台时,时间线记录中不应该有任何事件发生。
找到问题所在
现在我们知道了web页面主要的耗电因素,并且给出了一些创建高效页面的一般规则。接下来讨论一下怎样找出并解决导致功耗过大的问题。
脚本
如上所述,现代CPU能够把功率从空闲态的非常低提升到非常高来满足用户交互和其他任务的要求。也正因为如此,CPU是导致电池寿命减少的主要原因。页面加载期间CPU要做一连串工作包括加载、解析、渲染资源,并且执行js。在大多数现代web页面上,执行js花费的时间远远高出浏览器用在其余加载过程中花费的时间。因为尽量减少js执行时间对省电有最大的效益。
测量CPU使用的最佳方法是使用Web Inspector,就像之前文章里所说的,时间线面板可以显示任意选定时间范围内的CPU活动。
为了高效地使用CPU,WebKit尽可能在多核上分配工作(使用Workers的页面也可以使用多核)。Web Inspector提供与页面主线程同时运行的线程的细分图表。例如,以下屏幕截图显示了滚动具有复杂渲染和视频播放的页面时的线程:
在寻找优化点时,应关注主线程,因为js运行在主线程上(除非您正在使用Workers)。我们可以使用时间线面板的 “JavaScript and Events” 项来了解触发脚本的内容。也许你在响应用户或滚动事件或从requestAnimationFrame触发隐藏元素的更新时做了太多工作。你需要了解你在页面上使用的JavaScript库和第三方脚本所做的工作。如果要深入挖掘,你可以使用Web Inspector的JavaScript profiler来查看时间都用在哪些地方。
“WebKit线程”中的活动主要由与JavaScript相关的工作触发:JIT编译和垃圾收集。因此减少运行的脚本数量并减少短生命周期的JavaScript对象可以降低webkit线程的活动。
WebKit调用的各种其他系统框架都使用线程,“Other thread” 包括了这些工作; “Other thread” 最主要的工作是渲染,我们将在下面讨论。
渲染
主线程CPU使用也可以通过大量布局和绘制来触发;这些通常由脚本触发,但是除了transform,opacity和filter之外的属性的CSS动画也可以触发它们。查看时间线面板的 “Layout and Rendering” 项将帮助你了解导致活动的原因。
如果 “Layout and Rendering” 显示的渲染过程不能清楚展示页面正在发生什么变化,可以启用 Paint Flashing:
这部分渲染将用红色背景的高亮显示,你可以滚动页面查看。注意,WebKit会保留一些“透视”图块以允许平滑滚动,因此窗体中不可见的图形仍然可以正常工作以使屏幕外图块保持最新。如果渲染展示在时间轴中,说明它正在工作。
除了导致CPU耗电外,渲染通常还会触发GPU工作。macOS和iOS上的WebKit使用GPU进行渲染,因此触发渲染可以显着增加耗电。额外的CPU使用通常显示在时间线面板 “CPU” 项中的 “Other threads” 下。
GPU还用于canvas渲染,包括2D画布和WebGL / WebGPU。为了最小限度使用绘图,canvas上显示的内容没有变化时不要调用canvas API,并尝试优化canvas绘制代码。
许多Mac笔记本电脑都有两个GPU,一个与CPU相同内核的集成GPU,功能不强但功耗低,一个功能更强大但是功耗也更高的独立GPU。WebKit默认使用集成GPU;你可以使用powerPreference上下文创建参数请求独立GPU,但只有在你可以证明电源成本合理时才执行此操作。
网络
无线网络会以意想不到的方式影响电池寿命。手机有功能更强大的无线模块(WiFi和蜂窝网络芯片)和更小的电池,因此受到的影响最大。遗憾的是,在实验室外测量网络的功率影响并不容易,但可以通过遵循一些简单的规则来减少。
降低网络功耗的最直接方法是最大限度地利用浏览器的缓存。减少页面加载时间的所有最佳实践也可以通过减少无线模块需要打开的时间来使电池受益。
另一个重要方面是在时间上将网络请求组合在一起。每当有新请求到来时,操作系统都需要打开无线模块,连接到基站或蜂窝塔,并传输字节。在发送分组之后,在发送更多分组的情况下,无线电保持供电少量时间。
如果页面非经常性的发送少量数据,则开销可能会大于传输数据所需的能量。
可以从 Web Inspector 的时间线面板的 “Network Requests” 项中发现此类问题。例如,以下屏幕截图显示了几秒钟内发送的四个单独请求:
同时发送所有请求将提高网络用电效率。
总结
我们可以对网页做很多优化来延长电池寿命。
在Web Inspector中测量对电池影响并降低损耗非常重要。这样做可以改善用户体验并延长电池寿命。
提高电池寿命的最直接方法是最大限度地降低CPU使用率。新的Web Inspector提供了强大的工具可以全程监控
为了让电池寿命更长,我们要:
在空闲时将CPU使用率降至零
在用户交互期间最大化性能以快速恢复空闲
原文地址:
https://webkit.org/blog/8970/how-web-content-can-affect-power-usage/
原文作者:Benjamin Poulain & Simon Fraser
喜欢小编的可以点个赞关注小编哦,小编每天都会给大家分享文章。
我自己是一名从事了多年的前端老程序员,小编为大家准备了新出的前端编程学习资料,免费分享给大家!
如果你也想学习前端,那么帮忙转发一下然后再关注小编后私信【1】可以得到我整理的这些前端资料了(私信方法:点击我头像进我主页有个上面有个私信按钮)
相关推荐
- 如何设计一个优秀的电子商务产品详情页
-
加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...
- 怎么在JS中使用Ajax进行异步请求?
-
大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...
- 中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革
-
前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...
- 前端监控 SDK 开发分享_前端监控系统 开源
-
一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...
- Ajax 会被 fetch 取代吗?Axios 怎么办?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...
- 前端面试题《AJAX》_前端面试ajax考点汇总
-
1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...
- Ajax 详细介绍_ajax
-
1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...
- 6款可替代dreamweaver的工具_替代powerdesigner的工具
-
dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...
- 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
-
接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...
- 福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光
-
时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...
- 2021年超详细的java学习路线总结—纯干货分享
-
本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...
- 不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!
-
Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...
- 2025 年 Python 爬虫四大前沿技术:从异步到 AI
-
作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...
- 最贱超级英雄《死侍》来了!_死侍超燃
-
死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...
- 停止javascript的ajax请求,取消axios请求,取消reactfetch请求
-
一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)
