为何小程序上线了,他们的内心却留下遗憾?

前言

出于多端投放和开放生态的考虑,闲鱼开始接入整个阿里小程序体系。闲鱼在9月份迅速上线了第一个小程序鱼塘小程序,由于刚接触不熟悉小程序体系,整体性能上有比较大的优化空间,主要表现在以下问题:

  • 小程序加载慢,低端 Android 机(Android vivo Y67)上首屏时间接近6s
  • 滚动卡顿,在 iPhone 7P 上滚动帧率平均在 40fps 左右
  • 滚动多屏数据之后 Tab 点击切换慢,在 iPhone 7P 上切换 Tab 等待时间 3-5 秒,瞬时帧率低于 30fps
    小程序由于其逻辑和渲染分离的架构特点,除传统 H5 优化手段之外还有其他不同点。本篇文章主要分析小程序构架对渲染的影响,以及鱼塘小程序下具体优化手段。

小程序架构

在分析具体优化 Case 之前我们先看下小程序架构,先要了解架构才能清楚如何去优化具体的业务代码。阿里小程序采用支付宝小程序的架构,这里引用一张支付宝小程序页面生命周期图。

目前市场上所有小程序都采用逻辑(worker)和渲染(webview)分离的方式。这样带来的好处是:

  1. 能够满足对于外部应用管控的诉求,由于业务逻辑没有运行在 webview 上,所以无法通过浏览器的API直接操作渲染动作,意味着不能通过脚本做一些动态化操作。所有渲染相关操作都是通过 axml 来定义,外部应用进行更改都需要通过平台审核。
  2. 多个页面可以共享同一个 JS 运行环境,整个小程序生命周期可以共享全局应用上下文,接近 App 的开发体验。
  3. 页面渲染与业务逻辑分开执行,不会出现 JS 逻辑执行导致渲染卡住的情况,有利于提升整体渲染性能。

但是这样也会造成一个显而易见的问题,页面性能强依赖 webview 和 worker 的通信效率:

  1. webview 和 worker 之间的通信是异步的。这意味着当我们调用 setData 时,数据变更不会立即体现到页面渲染上,而是需要从 worker 异步传输到 webview 。
  2. 数据传输时需要序列化为字符串,然后通过 evaluateJavascript 方式传输,数据大小会影响传输性能。

小程序逻辑和渲染分离的架构造成它与传统 H5 性能优化方式上的一些差异。小程序性能优化可以参考看下官方推荐的一些性能优化建议,简单来讲需要特别注意 setData 操作的频次和传输数据,接下来我们结合鱼塘小程序具体案例一块探讨下。

业务层优化

鱼塘小程序是一个类似兴趣圈子下的内容聚合场景,用户在这里可以无限加载浏览内容,还会点击 Tab 切换浏览不同维度的内容。我们需要重点考虑小程序加载流畅度、滚动顺滑度以及 Tab 点击切换时候界面响应速度。之前版本的鱼塘小程序在低端 Android 机(Android vivo Y67)上首屏时间接近6s,在 iPhone 7P 上滚动帧率平均在 34fps - 60fps,点击 Tab 切换瞬时帧率在 30fps 左右,下面针对几个具体 Case 讨论解决方案。

加载慢

『BEFORE』


『AFTER』

问题表现

从打开小程序到最终渲染出来经历了短暂的白屏

原因分析

加载整体耗时包括小程序容器初始化、数据请求以及请求结果返回到渲染,需要针对每个时期做优化

优化手段

  • 引入小程序实例保活机制,降低小程序启动耗时
  • 将数据请求提前至 page.onLoad 中,请求阶段加入闲鱼 Loading 提示,通过交互减少用户焦虑感
  • 首屏数据离线化,在首屏数据到达前预渲染,在容器测请求提前至与小程序实例启动并行或更前
  • 将首屏数据进行拆分,初始化只 setData 可见视图对应的数据

滚动卡顿

『BEFORE』


『AFTER』

问题表现

页面滚动掉帧感明显,粘手度低

原因分析

  • 由于需要监听页面滚动距离触发顶部 Bar 显示,Page 层监听了 onScroll 事件,并在回调中频繁的调用 setData
  • 加载下一页 Feeds 的请求回调中,解析数据时多次调用 setData
  • Feeds 卡片内部监听了组件的 onAppear 和 onDisappear 事件,并在回调中调用 setData,目的是为了不重复发送曝光埋点

优化手段

针对小程序 webview 和 worker 通信的机制,我们需要减少 setData 的调用频率与传输数据大小。

  • 优化了 onScroll 回调逻辑,改为只有在部分时机(滚动距离在一定范围内)下才会触发 setData,且只做局部渲染
  • 加载下一页 Feeds 的请求回调优化了数据解析逻辑,只调用一次 setData,并参考官方优化建议使用 $spliceData 渲染长列表
  • 将 setData 的数据大小进行优化,只传输会影响视图的相关数据
  • 不再监听组件 onAppear 和 onDisappear 事件,改为监听组件的 onFirstAppear 事件,只有第一次 Appear 的时候才执行曝光操作

Tab 切换响应慢

『BEFORE』


『AFTER』

问题表现

加载几页 Feeds 后,切换 Tab 开始出现明显卡顿,需等待 3-5 秒,部分 Android 机器上更为严重,偶尔会 Crash

原因分析

Tab 切换时在短时间内做了太多事情:切换 Tab Current 状态、销毁 Feeds 列表、展示 Loading 动画、发起数据请求 -> 渲染新列表,这样高并发大面积的内容更新导致小程序视图层数据消费阻塞,从而产生卡顿感。

优化手段

  • 将 Tab 切换时的任务拆解开,分四个阶段进行:

    • 切换 Tab Current 状态,执行 Tab 切换动画
    • 在 Tab 切换动画完成后将页面滚动到 Tab 刚好 Sticky 住的位置
    • 销毁 Feeds 列表,展示 Loading 动画
    • 发起数据请求 -> 渲染
  • 经过这样的拆解,将之前的『高并发大面积』转换成了『分阶段可控制』的更新方式,随之带来的就是界面上的流畅

容器层优化

小程序容器通过离线缓存、数据预加载、小程序保活等机制来优化整体性能。然而在富交互场景中,webview 上的控件渲染会遇到很多性能瓶颈,目前阿里小程序支持在 webview 中内嵌 native 组件来提升整体性能,鱼塘小程序中有大量视频内容场景,使用的 video 组件就是 native 原生组件。这类组件脱离 webview 线程之外渲染,但是由于是覆盖在 webview 之上,所以在 webview 内无论怎样修改 z-index 都无法将元素覆盖在原生组件之上。

为了解决这个问题,小程序框架同学又设计了 cover-view ,它可以覆盖在 native 组件之上,比如视频上方的播放按钮就可以用 cover-view 盖上去。最终线上鱼塘小程序通过同层渲染 video 组件之后用户侧体验有比较大的提升。

总结与展望

经过优化之后,目前线上鱼塘小程序相比之前版本有显著提升:

针对这个业务场景下的小程序依然有很多可以继续优化空间,例如我们将每个鱼塘实例化独自小程序,这样可以针对每个鱼塘小程序去进行保活等。此外在小程序性能优化相关上,我们认为可以在研发阶段提供一个包含性能告警的容器,通过监听 setData 的调用频率与传输数据大小,对开发者一些可能会影响性能的代码写法进行提示。未来我们会持续在闲鱼小程序生态建设上发力,整合集团研发资源建立闲鱼小程序研发全链路最佳实践,提供外部服务商入驻开发三方小程序的良好体验。


iPhone 11 Pro、卫衣、T恤等你来抽,马上来试试手气 https://www.aliyun.com/1111/2019/m-lottery?utm_content=g_1000083877

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高德亿级流量接入层服务的演化之路

2019杭州云栖大会上,高德地图技术团队向与会者分享了包括视觉与机器智能、路线规划、场景化/精细化定位时空数据应用、亿级流量架构演进等多个出行技术领域的热门话题。现场火爆,听众反响强烈。我们把其中的优秀演讲内容整理成文并陆续发布出来&#xff…

一篇与众不同的 String、StringBuilder 和 StringBuffer 详解

来源 | 程序员 cxuan责编 | Carol封图 | CSDN 付费下载自视觉中国这是一道老生常谈的问题了,字符串是不仅是 Java 中非常重要的一个对象,它在其他语言中也存在。比如 C、Visual Basic、C# 等。字符串使用 String 来表示,字符串一旦被创建出来…

Ververica Platform-阿里巴巴全新Flink企业版揭秘

摘要:2019云栖大会大数据 & AI专场,阿里巴巴资深技术专家王峰带来“Ververica Platform-阿里巴巴全新Flink企业版揭秘”的演讲。本文主要从Ververica由来开始谈起,着重讲了Ververica Platform的四个核心插件App Manager、Libra Service、…

滴滴经验分享:SQLFlow如何让运营专家用上AI?

蚂蚁金服过去十五年,重塑支付改变生活,为全球超过十二亿人提供服务,这些背后离不开技术的支撑。在2019杭州云栖大会上,蚂蚁金服将十五年来的技术沉淀,以及面向未来的金融技术创新和参会者分享。我们将其中的优秀演讲整…

秒杀场景_Sentinel在秒杀场景的应用_05

上一篇解决了在高并发秒杀场景下的超卖问题,这一篇主要解决如何利用Sentinel防止服务器雪崩。 文章目录一、 商品微服务集成Sentinel1. 引入依赖2. 添加配置二、 秒杀微服务集成Sentinel2.1. 引入依赖2.2. 添加配置三、 Sentinel流控规则3.1. 登录Sentinel3.2. 请求…

SQLServer 密码验证登录18456错误解决方案

一、SQLServer18456错误 二、解决方案 第一步:确定这两个服务都是开启状态 (1)点击管理 (2)点击服务和应用程序 (3)确定这两个都是开启状态 (4)开启方法,右…

80% 的 Java 焦虑,都可以被这张图解决

昨晚,我在路口等车的时候,听到几个人在那讨论问题:“之前我用 jprofiler 监控 jvm 里的对象,当老年代满了,我手动触发一次 fgc,发现只能回收一半,再触发一次,就完全回收,…

直击案发现场!TCP 10倍延迟的真相是?

阿里妹导读:什么是经验?就是遇到问题,解决问题,总结方法。遇到的问题多了,解决的办法多了,经验自然就积累出来了。今天的文章是阿里技术专家蛰剑在工作中遇到的一个问题引发的对TCP性能和发送接收Buffer关系…

今日头条在消息服务平台和容灾体系建设方面的实践与思考

本篇文章整理自今日头条的沈辉在 RocketMQ 开发者沙龙中的演讲,主要和大家分享一下,RocketMQ 在微服务架构下的实践和容灾体系建设。沈辉是今日头条的架构师,主要负责 RocketMQ 在头条的落地以及架构设计,参与消息系统的时间大概一…

秒杀场景_同步秒杀分析和实战_01

文章目录一、应用部署准备1. mysql安装部署2. redis安装部署3. nacos安装部署二、数据库准备2.1. 创建数据库2.2. 初始化表结构2.3. 搭建微服务父工程三、商品模块微服务3.1. 搭建product-serv模块3.2. 配置yml3.3. 实体3.4. 接口3.5. service3.6. controller3.7. 启动类四、秒…

Kali 2020版 Linux操作系统解决系统语言问题(英文--中文)

文章目录一、更新镜像源(1)进入配置文件(2)更新软件包二、修改配置(1)打开终端输入以下数据(2)修改配置文件三、安装中文字体四、restart(重启Kali Linux系统)一、更新镜像源 镜像源有很多,我这里提供了阿里云的镜像源…

Spark Relational Cache实现亚秒级响应的交互式分析

本次分享主要分为以下四个方面: 项目介绍技术分析如何使用性能分析 一、项目介绍 项目背景 阿里云EMR是一个开源大数据解决方案,目前EMR上面已经集成了很多开源组件,并且组件数量也在不断的增加中。EMR下层可以访问各种各样的存储&#xf…

阿里巴巴 Kubernetes 应用管理实践中的经验与教训

导读:云原生时代,Kubernetes 的重要性日益凸显。然而,大多数互联网公司在 Kubernetes 上的探索并非想象中顺利,Kubernetes 自带的复杂性足以让一批开发者望而却步。本文中,阿里巴巴技术专家孙健波在接受采访时基于阿里…

那些被大数据时代抛弃的人

作者 | 衣公子来源 | 衣公子的剑(ID:yigongzidejian)前言2000年,微软如日中天。有人问比尔盖茨(Bill Gates)对于IT行业的看法。盖茨说,挺好的,就是有点noise。 noise,本意…

秒杀场景_多线程异步抢单队列分析与实现_02

文章目录1. 实体2. Service改造3. 启动类1. 实体 package com.gblfy.entity;import java.io.Serializable;/*** 用户排队抢单信息实体*/Data public class SkillEntity implements Serializable {private Long productId;private String userId; }2. Service改造 SkillGoodSe…

AI赋能DevOps:数据驱动的全栈工程师实践

DevOps是什么? 对于传统的软件研发而言,开发,测试,运维,运营,有不同的岗位进行分工协作,以保证质量和专业度,同一件事情,依赖不同岗位的排期、沟通、协调,效率…

阿里HBase高可用8年“抗战”回忆录

2017年开始阿里HBase走向公有云,我们有计划的在逐步将阿里内部的高可用技术提供给外部客户,目前已经上线了同城主备,将作为我们后续高可用能力发展的一个基础平台。本文分四个部分回顾阿里HBase在高可用方面的发展:大集群、MTTF&a…

使用apache POI把list集合里面的实体写入Excel(java)

一、导入maven依赖包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId>&…

一文带你了解混淆矩阵!

来源 | 数据科学CLUB封图 | CSDN 下载自视觉中国混淆矩阵是一个表&#xff0c;经常用来描述分类模型(或“分类器”)在已知真实值的一组测试数据上的性能。混淆矩阵本身比较容易理解&#xff0c;但是相关术语可能会令人混淆。让我们从一个二进制分类器的混淆矩阵示例开始(尽管它…

从0到千万DAU,这5年闲鱼架构如何演进?

阿里妹导读&#xff1a;闲鱼品牌创立于14年阿里的某个茶水间&#xff0c;从0开始到现在千万DAU&#xff0c;5年时间里闲鱼见证了闲置物品从线下到线上交易的转移。而线上交易的繁荣&#xff0c;则需要业务架构做相应的调整、演进才能支撑业务的快速发展。本文主要通过介绍闲鱼从…