干货 | 秒开率70%+,携程金融SSR应用性能监测与优化

一篇文章看懂前端性能优化(2026详解) 性能优化这个词我们经常会在前端的工作或面试中遇到,这个东西说难好像也并不怎么难,毕竟谁都能说上几点。但是如果你想在工作上遇到各种场景的性能瓶颈时都有直击本质的性能方案,或者在面试时让面试官眼前一亮,那就不能只拘泥于『想到哪说到哪』或者『说个大概』,而要有一套体系化的、各个角度的、深入了解的知识图谱。这篇文章也算对我个人的前端知识的一次归纳总结,因为『性能优化』不仅仅是『优化』,什么意思呢?实施优化方案之前,首先要知道为什么要这样优化,这么做的目的是什么。这就需要你上到框架、js、css,下到浏览 阅读详情

作者简介

 

建成,携程高级前端开发,对前端工程化、性能优化、效率提升等方面有浓厚兴趣。

背景

对于一款互联网产品来说,用户体验始终扮演着重要的角色,尤其是在后互联网时代,增量见顶,竞争方向逐渐转为存量用户,体验的好坏可能直接决定着一个用户的去留。

据统计,网页加载时间从 1 秒增加到 3 秒,跳出率就会提高 32%;如果网页加载时间从 1 秒增加到 6 秒,跳出率就会上升 106%。

基于此,携程金融前端团队对内部SSR应用的性能实施了一系列的治理,本文将从性能监测、数据处理与分析、优化之路等方面来分享。

一、性能

用户体验是一个比较感性的概念,每个人的感受可能都不太一样,较难进行衡量。基于此,我们首先要把用户体验进行量化,使其可衡量和监测。

根据业内经验和相关分析,用户体验和页面首屏时间、页面累积布局偏移量有较强相关性,通过计算和监测这两个指标可以来衡量应用的用户体验。


二、性能监测

从技术方面来讲,前端性能监控主要有两种方式,一种是合成监控(Synthetic Monitoring,SYN),另一种是真实用户监控(Real User Monitoring,RUM)。

为了凸显用户真实的体验,我们采用了真实用户监控(即通过用户实际操作产生的一系列性能指标数据进行监测)。


2.1 页面首屏时间

页面首屏时间主要涉及到浏览器请求和渲染流程。

2.1.1 性能指标选定

为了能监测应用全链路性能表现,我们在整个链路中选取了最重要的几个节点,分别如下:

1a5bbc829b5810ecffc135d9aabdaf11.png

  • DNSDuration:衡量DNS时长

  • TCPDuration:衡量TCP链接时长

  • TTFBDuration:衡量浏览器接受到第一个字节的时长

  • RequestDuration:衡量SSR服务端处理时长

  • FCP:衡量携程端首屏时间

  • DOMContentLoaded:衡量去哪儿和携程金融app首屏时间(native loading隐藏时间点)

  • Load:衡量所有资源加载并执行时长

2.1.2 最佳表现(P90)

  • RequestDuration:300ms

  • FCP:800ms

  • DOMContentLoaded:1000ms

2.1.3 性能指标的收集

指标的收集会用到两个api,分别为监测Android的PerformanceObserver和监测iOS的 Performance.timing。

// 创建性能监测实例
function createPerformanceObserver(callback) {
    // Create the performance observer
    const po = new window.PerformanceObserver(list => {
        callback && callback(list)
    })


    return po
}


// 性能监测处理函数
function performationAduitCallback(list) {
    for (const entry of list.getEntries()) {
        if (entry.entryType === 'navigation') {
              // navigation
              const DNSDuration = entry.domainLookupEnd - entry.domainLookupStart
              const TCPDuration = entry.connectEnd - entry.connectStart
              const RequestDuration = entry.responseEnd - entry.requestStart
              const TTFBDuration = entry.responseStart - entry.startTime
              const DOMCompleteDuration = entry.domContentLoadedEventEnd - entry.startTime
              const DOMLoadDuration = entry.duration


              // FCP
              let FCPDuration = 0;
              if (performance && performance.timing) {
                  FCPDuration = window.headReadyTime ? window.headReadyTime - performance.timing.navigationStart : 0;
              }


              const performanceParams = Object.assign({}, extraInfo, {
                  DNSDuration,
                  TCPDuration,
                  RequestDuration,
                  TTFBDuration,
                  FCPDuration,
                  DOMCompleteDuration,
                  DOMLoadDuration,
              })


              sendPerformance(performanceParams)
        }
    }
}


// 性能指标监测(安卓)
function performationAduitAndroid() {
    try {
        const PO = createPerformanceObserver(performationAduitCallback)


        PO.observe({
            entryTypes: ['navigation'],
        })
    } catch (e) {
        console.log('performationAduitAndroid error', e)
    }
}
// 性能指标监测(IOS)
function performationAduitIos() {
  const timing = performance && performance.timing
  if (!timing) {
      return
  }


  const start = timing.navigationStart
  const param = util.merge(
      {},
      {
          DNSDuration: timing.domainLookupEnd - timing.domainLookupStart,
          TCPDuration: timing.connectEnd - timing.connectStart,
          RequestDuration: timing.responseEnd - timing.requestStart,
          TTFBDuration: timing.responseStart - start,
          FCPDuration: window.headReadyTime ? window.headReadyTime - start : 0,
          DOMCompleteDuration: timing.domContentLoadedEventEnd - start,
          DOMLoadDuration: timing.loadEventEnd - start,
      }
  )


  const performanceParams = Object.assign({}, extraInfo, param)
  sendPerformance(performanceParams)
}

2.2 页面累积布局偏移量(CLS)

CLS (Cumulative Layout Shift) 是Web Vitals指标之一,主要用于测量整个页面生命周期中,布局移位的分值,以此衡量视觉稳定性。

2.2.1 性能指标的选定

衡量页面累积布局偏移量的指标只有一个,就是CLS。通过减少CLS,可以减少用户因为页面突然移位造成的误触概率。

2.2.2 最佳表现(P90)

  • CLS:0.05

2.2.3 性能指标的收集

CLS的收集同样使用 PerformanceObserver 这个api,这个api会有兼容性问题,只能应用于Android。

// 创建性能监测实例
function createPerformanceObserver(callback) {
    // Create the performance observer
    const po = new window.PerformanceObserver(list => {
        callback && callback(list)
    })


    return po
}


// CLS处理函数
function clsAduitCallback(list) {
    for (const entry of list.getEntries()) {
        if (entry.entryType === 'layout-shift') {
            // CLS
            const CLS = entry.value ? entry.value * 1000 : 0
            const CLSParams = Object.assign({}, extraInfo, { CLS })
            sendPerformance(CLSParams)
        }
    }
}


// CLS数据指标(安卓)
function clsAduit() {
    try {
        const clsPO = createPerformanceObserver(clsAduitCallback)


        if (window.PerformanceObserver.supportedEntryTypes.includes('layout-shift')) {
            clsPO.observe({
                type: 'layout-shift',
                buffered: true,
            })
        }


        window.addEventListener('load', () => {
            // 延迟1s取消监听
            setTimeout(() => {
                clsPO.disconnect()
            }, 1000)
        })
    } catch (e) {
        console.log('cls error===>', e)
    }
}

三、数据处理与分析

数据收集好之后,还需要对数据进行加工处理,才能客观的反应出应用的性能状况。加工处理的方式如下:

3.1 百分位数

在数据分析中,我们通常想衡量大部分用户的性能表现,而所有统计的数据中会存在一些异常的数据,因此需要对原始数据取百分位数进行分析。目前金融内部会取P50和P90两个百分位数进行分析。


3.2 分端统计

金融大部分应用主要运行在携程端、携程金融端和去哪儿端,为了衡量各端的性能情况,我们将数据进行了分段统计。


3.3 秒开率统计

页面首屏时间能反映出大部分用户的性能表现;秒开率能反应出性能最佳表现的用户所占比例。通过这两个数据基本上能衡量出我们应用的性能状况。

秒开率计算方法 = count(固定时间段内页面首屏时间 < 1s) / count(*)


四、优化之路

通过上面的数据处理和分析,已经能准确了解到应用的整体性能表现以及各阶段性能情况,下面就有针对性地对各阶段进行优化处理。

4.1 DNSDuration

  • 选择性的使用DNS Prefetch

隐式 DNS Prefetch:浏览器会对页面中和当前域名不在同一个域的域名进行prefetch。因此显式DNS Prefetch应用于页面中未出现的域名。所以二级页面中的域名如果在首页中没有出现,可以选择使用DNS Prefetch。


4.2 TCPDuration

前端的能力很难对TCP连接阶段进行优化,但是可以利用TCP的一些特点,进行资源获取的优化。

  • 首页的html size小于14k

由于TCP Slow Start的原因,我们应尽可能的将首页的html size控制在14k以内,使首页数据可以在一个TCP包中发送到浏览器,加快渲染速度。

  • Http1 → Http2减小TCP连接次数和减少渲染阻断

应用HTTP2多路复用和浏览器渲染流程。


4.3 RequestDuration

  • 优化服务端接口响应时长

  • 非必要接口放到客户端异步请求


4.4  FCP

  • CSS做内联


4.5 DCL

  • Preload提升阻塞JS下载优先级

  • 将webpack打包出的Bundle JS同步变异步(Async)

  • 减小JS Size:抽离公共chunk

  • 高效利用缓存:根据改动频率split chunk + ContentHash + 缓存


4.6 onload(页面完全展示)

  • 接口数据缓存:与用户关联度较小的接口

  • 图片转webp

  • 图片size控制

  • 字体preload


4.7 CLS

  • 尽可能可以不发生移位

  • 发生移位的位置尽可能影响更少的区域

  • 移位的距离尽可能小,且使用动画

  • 骨架图


五、总结

通过以上的治理步骤,金融主要SSR应用的秒开率都提升到了70%以上,且做到实时监控性能变化,一旦性能出现问题,可以及时感知并采取措施进行解决。

相信通过以上的努力,可以给金融所有的用户一个良好的用户体验,从而助力产品发展。

【推荐阅读】

97cafef5d09075399253f5daefc464e5.png

 “携程技术”公众号

  分享,交流,成长

TiKV 监控指标详解 使用 TiUP 部署 TiDB 集群时,一键部署监控系统 (Prometheus & Grafana),监控架构参见。目前 Grafana Dashboard 整体分为 PD、TiDB、TiKV、Node_exporter、Overview、Performance_overview 等。 阅读详情

相关推荐

性能优化2.0,新增缓存后,程序的秒开率不升反降

我理解的缓存的本质就是一个用空间换时间的一个思想。

学Java,找哪吒 3135

启动优化实践 - 秒开率从17%提升至75%

启动性能是App使用体验的门面,耗时过长会降低用户使用兴趣。对于开发者来说,通过各种技术手段来提升启动性能缩减启动时长,对整站业务的各项指标提升都会有较大帮助。因此,秒开率优化也成为了各个客户端团队在体验优化方向上十分重要的一环。本文将会结合我自己在项目中优化启动速度的经验,跟大家分享下,我眼里的科学的启动速度优化思路。在我的眼里,科学的优化策略是通用的,不管是针对什么性能指标不管是针对什么课题,思路是差不多的。比如这期的分享是启动优化,其实跟上期分享的。

chuyouyinghe的专栏 1279

k最近邻算法——电影分类及案例详解

如图3-7所示,若将国际象棋棋盘放在二维直角坐标系中,格子的边长定义为1,坐标的x轴及y轴和棋盘方格平行,原点恰落在某一格的中心点,则王从一个位置走到其他位置需要的步数恰为二个位置的切比雪夫距离,因此切比雪夫距离也称为棋盘距离。关于这里的距离度量,这个电影分类的例子有2个特征,也就是2维的,可以使用我们高中学过的两点距离公式(两点距离公式其实就是欧氏距离在二维空间上的公式,也就是欧氏距离n的值为2的情况,欧氏距离也称为欧几里德距离)来计算距离,如图3-3所示。对数据进行归一化,避免量纲对计算距离的影响。

ZhShy 4555

H5页面秒开优化与实践

▼关注「之家前端共享」,获取更多技术干货▼文章结尾有视频资料1. 背景3月份针对线上重点H5项目秒开进行治理,本文将逐步介绍如何通过H5页面的优化手段来提高 1.5 秒开率。2.为什么要优化从用户角度看,优化能够让页面加载得更快、对用户操作响应更及时,用户体验更良好,提升用户体验和降低用户流失率非常重要。其中 Global Web Performance Matters for ecomme...

程序员成长指北 1095

随机森林模型及案例(Python)

1 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。 集成学习模型的常见算法有Bagging算法和Boosting算法两种。 Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则为AdaBoost、GBDT、XGBoost和LightGBM模型。 1.1 Bagging算法简介 Bagging算法的原理类似投票,每个弱学习器都有一票,最终根据所有弱学习器的投

qq_42433311的博客 4万+

常用的串口通信工具MobaXterm、Bus Hound、SScom等

本文介绍了四种PC端串口通信工具的功能和使用方法:MobaXterm支持SSH、FTP、串口等多种协议;Bus Hound用于监控CAN和串口数据;SScom专为串口和网口通信设计;ScriptCommunicator可进行串口通信并绘制波形图。每种工具都有详细的操作步骤图示,包括参数设置、数据监控等关键功能,并提供了官方和个人下载地址。这些工具各有特点,适用于不同的串口通信和数据分析场景。

sanqima的专栏 2485

移动端页面秒开优化总结

App优化,是一个工作、面试或KPI都绕不开的话题,如何让用户使用流畅呢?今天谨以此篇文章总结一下过去两个月我在工作中的优化事项到底有那些,优化方面还算小白,有不对的地方还望指出海涵,该文章主要通过讲述。...

魔都大白 840

R语言vegan包实战:用varpart函数搞定生态学VPA分析(附完整代码与数据集)

本文详细介绍了如何使用R语言vegan包中的varpart函数进行生态学方差分解分析(VPA),包括数据准备、模型构建、结果解读和可视化呈现。通过完整的代码示例和数据集,帮助研究者理解不同环境因子对生物群落变化的相对贡献,并掌握显著性检验等高级技巧。

weixin_42525005的博客 447

秒开率破90%!交易后台渲染性能优化 | 得物技术

一直以来,体验都是得物技术部的关键词之一,对于前端开发而言,提高用户体验更是一项至关重要的工作。本文从本次交易后台性能优化实践出发,同时介绍应用整体架构和设计,希望可以给参与网站性能建设的同学提供一定的学习和参考价值。

SmartCodeTech的博客 2158

实战指南!基于STM32的智能环境监测系统(代码+硬件设计+云端控制)

本文详细介绍了基于STM32的智能环境监测系统的设计与实现,包括硬件选型、电路设计、软件架构和云端控制。系统通过DHT11温湿度传感器和MQ-2烟雾传感器实时监测环境数据,STM32F103C8T6主控芯片处理数据并通过ESP8266上传至中国移动物联网平台,支持手机APP远程监控。项目成本低、稳定性高,适合智能家居和环境监测应用。

weixin_29194817的博客 433

ORB-SLAM3的Euroc数据集测试

(一)测试运行 不同模式测试过程(以MH_03为例) 1、pure mono 运行SLAM: cd ORB-SLAM3/Example #run slam ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH03 ./Monocular/EuRoC_TimeStamps/MH03.txt dataset-MH03_mono 利用ORB-SLAM3自带..

ljtx200888的博客 9144

得物AppH5秒开优化实战

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群导读 一开始我们的H5页面秒开率只有30%左右,现在我们的H5页面秒开率达到了 75%。这中间巨大的差异究竟有哪些黑科技在里面?我们为什么要做H5页面的秒开优化?我们的秒开指标是如何统计的?客户端和H5是怎么配合做到 1+1>2的?监控是如何发现H...

程序员成长指北 2498

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

【代码】修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

路~可以走过 2772

前端性能总结

首次交互延迟 度量是从用户首次和网站进行交互到响应事件的时间延迟的时间,页面加载阶段往往容易产生卡顿,大部分页面的主线程在此时都很繁忙。(Time TO First Byte):是指客户端从发起请求到接受到服务器相依的第一个字节的时间,是反映网站性能的重要指标。: First Meaningful Paint 第一次有意义的绘制 这是一个主观指标,可以认为是页面核心内容展示的时间。: First Paint 第一次在页面上绘制的时间,这个时间仅仅是指开始绘制的时间,但未必真的绘制什么有效的内容。

学不会的WebGL 739

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

从 “卡顿” 到 “秒开”:外投首屏性能优化的 6 个实战锦囊|得物技术

在互联网时代,网站性能的好坏直接影响用户体验和转化率。对投放的广告页面而言,如何在保证视觉效果和功能的同时提升加载速度,成为了开发者必须面对的挑战。

SmartCodeTech的博客 1647

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

为了彻底搞懂性能优化,肝了十几家大厂的性能优化项目实战,最后浓缩成这份性能优化实战篇.

背景 安卓诞生以来,就一直有这样的话题 “安卓手机越用越卡”,其实安卓手机卡顿的原因很多,例如某些APP越来越臃肿,全家桶唤醒、占用运存过多,导致手机的运存不够用了。 又例如因为消息推送服务的关系,APP需要一直后台运行,同样也会占用非常多的运存,这也就是为什么现在安卓手机的运存越来越大。 为了优化安卓手机性能,目前的方法也是非常多,例如冻结APP唤醒、使用小程序/PWA程序代替部分应用、刷第三方优化过的ROM、CPU性能调度、刷内核等等…… Android必备技能 作为一个Android程序员,性能优化是

老皮的博客 724

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

性能优化简介

性能优化性能优化的重要性及方向优化方法性能优化的四个方向流畅性优化方向页面显示速度启动速度优化响应速度内存优化常见内存泄露原因优化内存空间稳定性优化流量优化安装包大小优化减少安装包大小的常用方案总结 性能优化的重要性及方向 优化方法 性能优化的四个方向 流畅性优化方向 页面显示速度 优化原因 页面需要绘制的内容(布局 控件)太多,从而导致页面测量时间过长 绘制效率过低,从而导致绘制时间过长 优化方案 布局层级优化 异步加载xml 离屏预渲染 启动速度优化 优化原因 初次打开应用时,大量

fakerXuan的博客 327

毫秒级突破!腾讯技术团队是如何做前端性能优化的?

百科无线Node服务上云通过百科无线 Node 服务接入腾讯云平台,引入七彩石、北极星寻址等腾讯内部的基础设施,实现服务自动伸缩容,进一步完善监控体系,降低机器和运营成本。百科无线加载速度优化百科无线技术体系升级总结技术体系升级工作与产品迭代并行,本次升级改造时间紧、任务重,还有很多需要优化和完善的地方。本次升级团队也获得了技术方面的沉淀,今后用户体验优化是一个长期的过程,慢慢的会融入到日常产品迭代中,给各位带来更好的体验!如果觉得本篇文章的内容对你有帮助,欢迎转发分享。-End-

Web面试那些事儿的博客 1091

性能优化的核心思路,干货分享

一、背景 平时技术交流的时候,很多同学都会问一些性能优化方面的问题。 比如: 有一张订单表为了保持订单记录,更新数据时不能删除,需要打算加上版本号,查询时取版本号最新的给前端,还有场景是查询订单历史给前端。 订单表量一般不会太小,每次先分组查询取出最大的一条,然后外层再去取对应的数据再分页显然性能不好。 怎么办? 可能也会有人会给出一些建议,然后呢?下次在遇到怎么办? 网上很少有文章系统讲解性能优化的相关方法论,所以借着这次机会总结出来,分享给大家。 俗话说授人以鱼不如授人以渔,本文将自己的性能优化方法

悟鸣的技术博客 2万+

腾讯企鹅辅导 H5 性能极致优化总结

项目背景 H5 项目是企鹅辅导的核心项目,已迭代四年多,包括了课程详情页/老师详情页/报名页/支付页面等页面,构建产物用于企鹅辅导 APP/H5(微信/QQ/浏览器),迭代过程中了也累积了一些性能问题导致页面加载、渲染速度变慢,为了提升用户体验,近期启动了 “H5 性能优化” 项目,针对页面加载速度,渲染速度做了专项优化,下面是对本次优化的总结,包括以下几部分内容: 性能优化效果展示 性能指标及数据采集 性能分析方法及环境准备 性能优化具体实践 一、性能指标及数据采

嘿嘿 675

浅谈 Web 前端性能优化

一、背景和目标 前端性能优化的话题大家一直都在讨论,无论是在工作还是面试都经常遇到 工作方面: toC 项目确实要着重考虑这个问题,强调性能和用户体验 ➡️「得用户者得天下」 面试方面:关于前端性能优化的面试题很多,比如: Web 性能优化有哪些常见的手段? 如何解决单页面应用首屏加载慢的问题? 为什么要把 <script> 放在 <body> 之后? <script> 的 async 和 defer 有什么区别? HTTP/1.1 和 HTT

Yingjieweb 的技术博客 1825

前端性能监控及优化方案

前言 互联网发展到今日,用户体验成为网站优劣评判的重要指标,用户不再停留在“能用即可”的阶段,而开始追求“更快,更美”。前端是最贴近于用户侧,所以前端性能优化就显得尤为重要。本文将介绍衡量前端性能的一些指标,并提出对应的优化方案,希望能对开发者有所帮助。 Apdex指数 在介绍指标之前,我们先了解一下Apdex指数(Application Performance Index,应用性能指数),它是用户对应用性能满意度的一个量化值,分布在0-1之间: 0 - 没有满意用户 1 - 所有用户都满意 0.7 是

crazy_jialin的博客 2658

【高并发】面试官:性能优化有哪些衡量指标?需要注意什么?

面试官问我性能优化,我回答的直接了当!!

冰河的专栏 1453

从响应时间到并发量:详解性能测试的每个关键指标

在讨论性能优化时,衡量指标是至关重要的参考因素。性能指标提供了一个客观的方法来测量和评估系统性能。这些指标主要包括响应时间、并发用户数、系统吞吐量、资源利用率等。

逆流的小鱼 1829
上一篇: 开源 | 携程 Foxpage 前端低代码框架
下一篇: 携程Tech Girl:做勇敢的女孩
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值