性能优化模型

萧让
• 阅读 1617

引子

About Performance 的最后提供了一些关注的点,但感觉比较零散,有没有理论体系化的思想作为依据,通过查找资料,发现了两种指导方式:RAIL ModelPRPL Pattern ,下面是带有个人理解的部分翻译。

翻译时 RAIL Model 原文 Last updated 2019-02-12 ,PRPL Pattern 原文 Last updated: Nov 5, 2018 。

RAIL Model

RAIL 是一个以用户为中心的性能模型,它将用户的体验分解为关键的操作。RAIL 的目标和方针旨在帮助开发人员和设计人员确保每一个操作都有良好的用户体验。通过设计一个考虑性能的结构,RAIL 使设计人员和开发人员能够有效的关注影响用户体验最大的工作。

每个 web 应用程序的生命周期都有四个不同的方面,性能以不同的方式适合它们:

性能优化模型

目标和方针

在 RAIL 的上下文中,目标(goals)和方针(guidelines)有特殊的含义:

  • 目标:用户体验相关的关键性能指标。因为人类的感知是相对稳定的,所以这些目标不太可能很快改变。
  • 方针:帮助你实现目标的建议。这些可能是特定于当前的硬件和网络连接条件,因此可能随着时间发生改变。

关注用户

让用户成为你的性能工作的焦点。下表描述了用户如何感知性能延迟的关键指标:

延迟时间 用户反应
0 - 16ms 人们特别擅长跟踪运动,如果动画不流畅,他们就会对运动心生反感。 用户可以感知每秒渲染 60 帧的平滑动画转场。也就是每帧 16ms(包括浏览器将新帧绘制到屏幕上所需的时间),留给应用大约 10ms 的时间来生成一帧。
0 - 100ms 在此时间窗口内响应用户操作,他们会觉得获取的结果是立即的。时间再长,操作与反应之间的联系就会中断。
100 - 300ms 用户会体验到轻微的可感知延迟。
300 - 1000ms 在此窗口内,延迟感觉像是一个连续任务自然进展的一部分。对于网络上的大多数用户,加载页面或更改视图代表着一个任务。
1000+ms 超过 1s ,用户对正在执行的任务失去注意力。
10,000+ms 用户感到失望,可能会放弃任务,之后他们或许不会再回来。

用户对性能延迟的感知不同,这取决于网络条件和硬件。例如,通过快速 Wi-Fi 连接在功能强大的台式机上,1000ms 内的加载体验是合理的,因此用户已经习惯了 1000ms 的加载体验。但低于 3G 连接速度较慢的移动设备来说,5000ms 内的加载体验是一个更实际的目标,因此移动用户通常更耐心。

Response:在 50ms 内处理事件

目标

在 100ms 内完成由用户输入启动的过度。用户花费大部分时间是在等待站点响应他们的输入,而不是等待站点加载。

方针

  • 在 50ms 内处理用户输入事件,是为了保证 100ms 内有可见的响应,否则动作与反应的联系就会断开。这适用于大多数输入,例如单击按钮、切换表单控件或启动动画。这不适用于触摸拖动或滚动。
  • 尽管这听起来可能有违直觉,但对用户输入做出立即响应并不总是正确的。你可以用这个 100ms 的窗口做其它昂贵的工作。但要注意不要阻塞用户,如果可能的话,在后台工作。
  • 对于需要超过 50ms 才能完成的操作,始终提供反馈。

50ms 还是 100ms ?

目标是在 100ms 内响应输入,那么为什么我们的预算只有 50ms ?这是因为除了输入处理之外,通常还有其它的工作正在处理,而这部分工作占据了可接受输入响应的部分时间。如果应用程序在空闲时间以建议的 50ms 执行工作,这意味着如果在其中一个工作块期间发生输入,则输入的排列等候可以长达 50ms。根据这一点,假设只有剩余 50ms 可用于实际的输入处理是安全的。此效果在下图中可见,显示了在空闲任务队列中,输入是如何接受的,从而缩短了可用的处理时间:

性能优化模型

Animation:10ms 内生成一帧

目标

  • 在10ms 或更短的时间内生成动画中的每一帧。技术上,每帧的最大预算是 16ms(1000ms / 60帧/s ≈ 16ms),但是浏览器需要大约 6ms 来渲染每个帧,因此每帧指导方针是 10ms 。
  • 以视觉平滑度为目标。当帧速率变化时,用户会注意到。

方针

  • 在像动画这样的高压点中,关键是不论能不能做,什么都不要做,做最少的工作。如果可能,利用 100ms 响应预先计算开销大的工作,这样你就可以尽可能增加实现 60fps 的可能性。
  • 查看 Rendering Performance 中动画优化策略。
  • 识别所有类型的动画。动画不仅仅是精致的 UI 效果。这些交互都被视为动画:

    • 视觉动画,例如进入、退出、补间和加载提示。
    • 滚动,包括抛掷,也就是用户开始滚动,然后放开,页面继续滚动。
    • 拖拽,动画通常遵循用户交互,如平移地图或捏缩放。

Idle:最大化空闲时间

目标

最大化空闲时间以增加页面在 50ms 内响应用户输入的可能性。

方针

  • 利用空闲时间完成延迟的工作。例如,对于初始页面加载,加载尽可能少的数据,然后使用空闲时间加载其余的数据。
  • 在 50ms 或更短的空闲时间内执行工作。再长一点,你就有可能干扰应用程序在 50ms 内响应用户输入的能力。
  • 如果用户在空闲时间工作期间与页面交互,则用户交互应始终具有最高优先级并中断空闲时间工作。

Load:传送内容并在 5s 内具备可交互性

当页面加载缓慢时,用户的注意力就会转移,用户会认为任务已经中断。快速加载的站点具有更长的平均会话时间、更低的跳出率和更高的广告可视性。

目标

  • 快速加载性能的优化与用户用于访问站点的设备和网络功能相关。目前,一个好的目标是,第一次加载的页面,在 5s 或更短的时间内在3G连接速度较慢的中档移动设备上具备可交互性。见 Can You Afford It?: Real-world Web Performance Budgets 。但要注意这些目标可能会随着时间的推移而改变。
  • 对于后续加载,一个好的目标是在 2s 内加载页面。但这个目标也可能随着时间的推移而改变。

性能优化模型

方针

  • 在用户之间常见的移动设备和网络连接上测试加载性能。如果您的企业有关于用户使用的设备和网络连接的信息,则可以使用该组合并设置自己的加载性能目标。否则,可以参考 The Mobile Economy 中的年度数据,选择合适的目标。
  • 请记住,尽管你的典型移动用户可能声称它的设备是在 2G、3G 或 4G 连接上,但实际上,由于数据包丢失和网络变化,有效连接速度通常要慢得多。
  • 专注于优化 Critical Rendering Path
  • 没有必要在 5 秒内加载所有的东西,以产生一种完整加载的感觉。启用渐进式渲染并在后台执行某些操作。将非必要加载推迟到空闲时间段。
  • 识别影响页面加载性能的因素:

    • 网络速度和延迟
    • 硬件(例如 CPU 速度慢)
    • 缓存回收
    • 二级/三级缓存的差异
    • JavaScript 解析

PRPL Pattern

PRPL 描述了一种模式,用于使网页更快的加载并变得可交互:

  • Push(或者 preload)最重要的资源。
  • 尽快渲染(Render)初始路径。
  • 预缓存(Pre-cache)剩余资源.
  • 延迟加载(Lazy load)其他路由和非关键资源。

Apply instant loading with the PRPL pattern 中主要结合了一种工具进行讲解,偏重实际操作,这里就不多介绍了。

参考资料

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这