《响应式Web设计性能优化》一2.3 Web运行时性能

2.3 Web运行时性能

正如我们已经讨论过的,Web性能跟踪的是内容传递到用户的耗时。现在来看看Web运行时性能,它跟踪的是用户与应用交互时应用的行为。

对于传统的编译类型应用,运行时性能是有关内存管理、垃圾回收以及线程等各个方面的。这是因为编译类的应用运行在内核之上,直接使用系统资源。

在客户端运行Web应用与运行编译类应用是大不相同的。这是因为Web应用运行在沙盒中,或者,说得更具体点,是运行在浏览器中。当它们运行的时候,用的是浏览器的资源。而浏览器是运行在它事先从内核中分配的内存资源中的。所以,当我们提到Web运行时性能,我们实际上说的是应用是怎样在客户端的浏览器运行,以及让浏览器在虚拟内存中其自身的内存里执行。图2-12是Web应用在常驻内存中的浏览器内存里运行的情况。


图2-12 一个Web应用运行在常驻内存中的浏览器预分配内存中

下面是我们需要考虑到的影响Web运行时性能的因素。

内存管理与垃圾回收
首先要看的是,我们有没有因为太多无用的对象以及创建更多对象时却仍保留这些无用对象而导致浏览器的内存分配被阻塞。随着时间推移,我们是否有什么机制限制JavaScript中的对象创建,或应用用的越多越久时,内存消耗是否也越多?是否存在内存泄露?

回收无用对象可能会导致浏览器在渲染或播放动画的时候暂停,容易在用户体验上出现锯齿现象。我们可以通过减少创建的对象数量以及尽可能重用已有对象来将垃圾回收次数降到最少。

布局
我们更新DOM的时候是否引发了页面重绘?这一般是由于大范围的样式变化,需要渲染引擎重新计算页面元素的大小与位置。

高代价的绘制
当用户滚动页面时,我们有没有因为绘制一些区域而加重浏览器的负担?动画效果或是更新除了位置、缩放、旋转或透明度之外的任意元素属性,都将引起渲染引擎重绘对应元素并消耗时间。位置、缩放、旋转以及透明度是渲染引擎最后配置的元素属性,所以,更新这些属性只需极小的开销。

如果我们在宽度、高度、背景或者其他属性上使用动画,渲染引擎就需要重新考虑页面的布局并且重绘那个元素,这就会在渲染和动画过程中消耗更多的时间。更糟的是,如果我们引起了父元素的重绘,渲染引擎就需要重绘所有的子元素,严重影响运行时性能。

同步调用
我们会在等待同步调用返回的时候阻塞用户的动作吗?当在操作复选框或其他方式接受输入后更新服务端的状态,再等待确认对应的更新操作已完成时,就会经常发生这样的事情。这会让页面感觉起来有些卡顿。

CPU占用率
浏览器渲染页面和执行客户端代码需要多大负载?

我们要查看的Web运行时性能指标是每秒的帧数和CPU的占用率。

每秒帧数
每秒帧数(FPS)是动画师、游戏开发者以及电影摄影师常用的一种度量单位。它是系统重绘屏幕的速率。按照Paul Bakaus的博客帖子“The Illusion of Motion”(http://bit.ly/1ou97Zn)中的说法,人类感觉动作平滑、逼真的理想帧率是60 FPS。

也有一个Web应用,叫每秒帧数 (http://frames-per-second.appspot.com),在浏览器中以不同的帧率演示动画效果。看这个演示,感受下自己的眼睛对同一个动画在不同帧率下的反应,很有意思。

FPS还是浏览器的一个重要性能指标,因为其反映出了动画运行以及窗口滚动的平滑程度。滚动时出现锯齿(卡顿)已经是Web性能问题的一个明显标志。

在Google Chrome中监控FPS
Google在创建浏览器内置工具追踪运行时性能方面在当前已是领头羊。其内置开发工具中已经包含了追踪FPS的能力。点击Rendering选项卡,然后选中“Show FPS meter”复选框,就可以看到(见图2-13)。


图2-13 在Chrome开发者工具中启用FPS meter

在浏览器的右上方会出现一个小的时间数列图,显示了当前FPS以及每秒帧数的趋势,如图2-14所示。使用这个工具,可以显式地追踪你的页面在实际使用过程中的执行情况。


图2-14 Chrome的FPS meter,位于Web页面的右上角

虽然FPS meter是很好的追踪每秒帧数的工具,但迄今为止,对在帧率方面体验下降进行调试的最有用的工具还是Timeline工具,这个也是Chrome开发者工具中的一员(见图2-15)。


图2-15 Frames模式下的Chrome Timeline工具

用Timeline工具,可以追踪以及分析浏览器运行的时候都干了些什么。它提供了3个操作模式:Frames、Events以及Memory。我们来看一下Frames模式。

Frames模式
这个模式下,Timeline工具展示了Web应用的渲染性能。图2-15是Frames模式的屏幕布局。

在Timeline工具中可以看到两个不同的窗格。顶部窗格展示的是活动模式(位于左手边),里面包含了一系列代表帧的竖条。底部窗格是Frames视图,这里展现的是形似瀑布的水平条状,标示了某个给定动作在帧里耗费的时长。在左边有对应动作的描述。在Frames视图的最右边是一个饼图,展示了在给定帧中最耗时动作的分类。所包含的动作如下所示。

Layout
Paint Setup
Paint
Recalculate Style
Timer Fired
Composite Layers

图2-15展现出运行JavaScript耗去了将近一半的时间,1.02秒中占了525毫秒。

使用Timeline工具,在Frames模式下,通过在Frames视图下找到最长的条,就能轻易地确定对帧率影响最大的动作。

内存分析
内存分析是监控我们应用所用到的内存消耗模式的一种方法。这对检测内存泄露与不会销毁的对象创建非常有用——JavaScript中,当我们用程序为DOM对象指定事件处理器,而后又忘记将事件处理器移除时尤为常见。更进一步,内存分析对优化内存占用也甚为有用。对象的创建、销毁与重用应当是智能的,要时刻注意,不要让剖析图中不断增加的一系列峰值呈上升趋势。图2-16描绘的是JavaScript堆。


图2-16 JavaScript堆中的对象

虽然浏览器内置的功能远比之前强大,但这仍是一个需要扩大和规范化的领域。迄今为止,Google已经做了很多,让开发者可以用上浏览器内置的内存管理工具。

MemoryInfo对象
在Chrome已有的内存管理工具中,首先我们要看的是MemoryInfo对象,它存在于Performance对象中。图2-17的截图中展示了一个控制台视图。


图2-17 MemoryInfo对象

可以像这样访问MemoryInfo对象。

performance.memory
MemoryInfo {jsHeapSizeLimit: 793000000, usedJSHeapSize:
37300000, totalJSHeapSize: 56800000}

表2-2展示出了与MemoryInfo相关的堆属性。

这些属性指出了可用和已用的JavaScript堆。堆是解释器保存在驻留内存中的JavaScript对象集合。在堆中,每个对象都是互有关联的节点,它们是通过诸如原型链或组合对象等属性连接起来的。浏览器中运行的JavaScript是通过对象引用来使用堆中对象的。当要销毁JavaScript中的一个对象,实际要做的就是销毁那个对象的引用。当解释器发现堆中对象不再有对象引用时,垃圾收集器将会从堆中移除这些对象。

用MemoryInfo对象,我们可以获取用户群与内存消耗相关的RUM数据,也可以在实验室里追踪这些指标,好在代码产品化之前发现潜在的内存问题。

Timeline工具
除了提供Frames模式来调试Web应用帧率之外,Chrome的Timeline工具还有Memory模式(如图2-18所示),能可视化地观察随时间变化的应用内存使用情况,并且会显示文档、DOM节点以及留在内存中的事件监听器的数量。


图2-18 Memory模式下的Chrome Timeline工具

顶部窗口展示的是内存剖析图,最底部的窗口展示了文档、节点以及监听器的数量。注意看,蓝色阴影区显示了内存使用率,可视化地展示了堆内存使用量。随着更多对象被创建,内存使用率也一直上升;当这些对象被销毁并被垃圾收集掉后,内存使用率就下降了。

可以在Mozilla开发网http://mzl.la/1r1RzOG找到一篇有关内存管理的很好的文章。

Firefox也开始开放内存使用数据,可以通过“about:memory”页面看到,Firefox的实现更多的还是通过静态信息页的方式而不是暴露一组API。正因为如此,它无法容易地插入程序中生成经验数据,about:memory页面更像是为Firefox用户(尽管是高级用户)设计的,而不是作为运行时性能管理的开发者工具集的一部分。

要在Firefox中访问“about:memory”页面,在浏览器的地址栏里键入about:memory。图2-19展示了这个页面的样子。


图2-19 Firefox的about:memory页面

如图2-19所示,可以看到以操作系统级别展示的浏览器分配的内存,以及浏览器打开的每个页面的堆分配情况。

时间: 2024-11-01 20:34:19

《响应式Web设计性能优化》一2.3 Web运行时性能的相关文章

《响应式Web设计性能优化》一导读

前 言 响应式Web设计性能优化 现如今,虽然响应式设计已经成为一个热门话题,但它仍然被当作一门前端技术.在大多数开发人员的印象中,响应式设计通常都与媒体查询有着紧密的关系.在本书中,我更愿意把响应式设计称为一种哲学,而不仅仅是一门技术:一个可以从传统单一的前端处理转变为从多方位考虑的理想解决方案,因为每个HTTP请求中都携带了许多信息到Web服务器,这样Web服务器就可以根据信息做相应的响应.在某些场景中,在后台实现响应式是一种更好的解决方案. 正因为周围的设计者和开发者常常有构建响应式站点方

《响应式Web设计性能优化》一2.2 追踪Web性能的工具

2.2 追踪Web性能的工具 追踪Web性能最常用和最有用的工具非瀑布图莫属了.瀑布图非常直观,可以展示构成Web页面的所有资源.加载这些资源所需的所有HTTP事务,以及每个HTTP请求消耗的时间.所有这些HTTP请求都展示成条状,一般y轴是资源的名称或URL.有的时候,资源的大小和资源的HTTP响应状态也会展示在y轴.x轴,或显式或隐式地展示出所消耗的时间. 瀑布图中的条形是按请求发生的顺序绘制的(见图2-4),条形区块的长度表示完成事务耗时的长短.在瀑布图的底部有时候也会看到总页面加载时间以

《响应式Web设计性能优化》一2.1 性能度量基础

2.1 性能度量基础 如果你正在阅读本书,很可能你已经熟知性能的含义,或是至少曾经围绕你的Web应用做过一些性能相关的讨论.但在继续往下看之前,我们来确认下在术语方面我们的理解是一致的. 如若这是你首次听到Web性能优化一词,赶快去搞一本Steve Souders的High Performance Web Sites和Even Faster Web Sites(均由O'Reilly出版)读一读.这些都是Web性能的标准,也是所有Web开发者都应掌握的基础知识. 本章并不打算覆盖性能的每个细节.从

《响应式Web设计性能优化》一2.4 小结

2.4 小结 本章探讨了Web性能以及Web运行时性能.我们关注了页面内容是怎样从Web服务器到浏览器的,以及在传输与内存渲染过程中存在的潜在瓶颈.还关注了在运行时表示Web应用执行情况的性能指标,这是性能的另一个关键点:不仅要看内存传输到终端用户有多快,还要看传输过去后应用的可用性. 我们使用了一些工具来量化和追踪两种类型的性能. 最重要的是,我们对本书剩余部分将要着重讲到的概念有了共同的认知.当我们谈及诸如降低页面负载以及HTTP请求数或者避免页面重绘这些概念时,可以翻回本章再看上下文. 第

《响应式Web设计性能优化》一1.1 响应式设计存在的问题

1.1 响应式设计存在的问题 我曾与我的一个团队和产品经理参加了一个产品规划会议,讨论重新设计我们的视频区块,我们的团队主管提出了可以让这个区块具备响应式体验的方案.我们勾勒了这样一张页面,它会去加载默认的HTML5视频播放器,不过会根据用户所使用的设备来调整播放器的大小以及加载不同视频类型的资源与播放列表.这样我们的页面将会非常漂亮,能够适应更多的浏览设备,而且我们的视频就可以面向以前被拒之门外的各种设备的观众了. 这时我们的产品经理皱起鼻子说道:"我们的响应式首页出来之后,我就开始觉得我们的

《响应式Web设计实践》一1.6 本书包含哪些内容

1.6 本书包含哪些内容 响应式Web设计实践本书由9章内容组成,包括你现在正在阅读的介绍章节.接下来的3章内容介绍了响应式设计的3个原则. 流动布局 这章讨论如何抛弃固定布局设计,并开始建立流动布局以及流动排版. 媒介查询 这章介绍了媒介查询:媒介查询的类型.如何使用它们以及如何确定断点. 响应式多媒体 这章关注图片和视频等具有固定宽度的元素,并会讨论该如何把它们合并到响应式布局中去. 在牢固地树立了上述3条原则之后,本书剩下的部分将会对响应式设计是如何影响现有的Web设计过程的进行探究. 计

《响应式Web设计实践》一1.5 为什么又是一本关于响应式设计的书

1.5 为什么又是一本关于响应式设计的书 响应式Web设计实践其实现在我们在实施响应式设计方面还没有取得什么成就,因为响应式设计要求我们对我们之前处理Web的方式进行重新翻修.由于能够迎接我们想到的挑战的工具和流程都还没有出现,所以我们需要先后退几步并问自己一些问题: 把台式电脑的体验设为默认体验是否有意义? 我们该如何调整工作流程,来应对不同设备和不同尺寸屏幕上的设计和原型? 我们该如何以一种更加结构化的方式来存储内容? 内容管理系统和所见即所得编辑器是否有天生的缺陷? 我们是否应该重新考虑一

让你精通响应式网页设计的15条建议(1)

响应式网页设计已经变成新的web标准,许多公司已经接受了这个挑战,并且已经建立起了专门的网页设计方案(比如只针对移动端的开发)或者已经开始试图解决跨平台的响应式网页设计方案.本文会带大家来看看一些实用的建议,以帮助你的设计过程,并使之变得更加高效. 1.计划 与往常一样,计划总是要放在第一优先级的.一旦你在纸上开始解决你的设计难题,你就已经准备好建立你的站点了. 2.充分利用好原型软件 推荐使用Adobe Edge Reflow,它能让你使用媒体查询,在程序内设置断点并设计适配桌面电脑.平板电脑

响应式设计不值得搞的5个原因

本文来自 Tom Ewer 的Managewp blog撰文,表达了其对时下风靡的响应式设计不一样的看法. 转向移动设计是比PC革命更大的革命--Kevin Lynch, CTO, Adobe 到2014年,会有更多的人用移动设备代替PC端访问互联网,所以打造易访问的移动端成了Web开发者最关注的问题之一.因此响应式设计应运而生,但从我个人的角度看,它并不值得大力追捧,为什么? 响应式设计不是万能的.我自己过去也是一个响应式设计的粉丝,发现很多Web应用不能很好的在移动屏幕上显示,Google地