我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flare应用前后端性能优化问题分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flare应用前后端性能优化问题分析

本篇内容主要讲解“Flare应用前后端性能优化问题分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flare应用前后端性能优化问题分析”吧!

写在前面

在聊 flare 之前,我想先聊聊 flame。

flame 是一个颜值在线的导航页项目,你可以将你常用的书签和在线应用存储在它上面。

Flare应用前后端性能优化问题分析

Flame 默认界面

在试用之后,我觉得项目还不错,于是稍作调整,封装了一个新的镜像:https://github.com/soulteary/docker-flame

Flare应用前后端性能优化问题分析

新封装的应用

在项目文档中,记录了我的修改:

  • 简化程序功能和依赖(如K8S),减少软件包体积,重构了一些细节逻辑,简化应用启动流程。

  • 重写了天气获取逻辑,使用城市名称替换经纬度来获取天气数据。

  • 对程序已有的一些小 BUG 进行了修复,支持中文搜索。

  • 对程序进行了简单的汉化。

但是随着深入使用,我发现页面有着比较大的性能问题。

因为波兰小哥采用了 SPA 方案,项目内又包含了 6700 多个 SVG 图标、以及若干网页字体,并且在接口上有一些小问题,导致了页面体积非常大,接口请求数量也非常多。

甚至当你上传一些包含元素比较多的 SVG 作为你书签图标的时候,由 React 触发的页面渲染会造成浏览器卡死。

我大概有几百个书签需要处理,预估未来书签数量还会增长,所以我使用程序批量创建了接近一千个书签。然后我发现渲染如此多的书签,页面会出现卡顿,甚至在页面内搜索包含关键词的书签也会感受到明显的掉帧。

所以,我决定重新写一个轻量一些的程序,来解决我的需求。

制作 flare 的过程,其实也是 flame 性能调优的过程。不过在解决问题之前,我们首先得能定位问题有哪些。

应用性能问题分析

关于这个应用的性能优化,其实并不复杂,和传统应用优化差别不大:优先减少计算量,在实在减少不了的情况下使用计算效率更高的方式来解决问题。

不过结合使用场景来说,在分析技术问题之前,可以先从功能入手。

对于我不适用的功能

首先从功能上看,我不需要这个应用与 Docker 集成,提供“服务发现”功能。比如在我启动容器后,这个应用会自动将新启动的容器作为书签或者应用进行添加。

其次,在拥有自己的 SSO 服务之后,我也不再需要使用简单的账号密码登录之类的功能,所以这个功能也可以去掉。

最后,关于书签数据的存储,我觉得在缺少用户体验非常棒的 Web 编辑器的前提下,可能不如配置声明的方式更易于管理和维护。(你可以使用任何你喜欢的编辑器来更新和维护内容,你可以使用 Git 或者任何你喜欢的方式,以白盒形式保存你自己的数据)。

基于上面的变化,我大概可以少写几个部分的代码:容器(Docker & K8S)集成、登录鉴权、应用和书签,以及书签分类的 “CRUD”。

前端架构中的问题

Flame 项目中,作者使用都是 create-react-app 脚手架创建的项目,项目依赖为: React v17 + TypeScript + Redux,为了提供简洁一致的图标,作者在前端引入了 Templarian/MaterialDesign-JS,一个被精心处理过的 DOM 结构非常简单的 SVG 图标库。

在使用构建工具打包、服务端 GZip 压缩之后,需要传输接近 1MB 的资源,原始脚本程序体积接近 3MB。相对膨大的程序体积导致了页面加载和执行时间都会比较长。比如页面页面首次渲染时间在 1s 上下浮动,多数情况下会超过 1s,完成时间一般都在 1.5s 以上。可能是作者对于服务端程序开发不够熟悉,虽然在前端进行应用配置更新时会复用接口,但是在内容页面展示时,会调用多达8个接口。此外,为了在页面中展示和更新天气信息,波兰小哥还使用了 WebSocket 来进行数据交互。

Flare应用前后端性能优化问题分析

Flame 应用性能概览

其他的问题,在文章前面已经提到过了,就不赘述了。

后端架构中的问题

项目使用的技术栈为 Node.js,Web 框架为市占率非常高的 Express 的最新版本,ORM 框架选择的则是 Sequelize,数据存储落地为 SQLite3 。上面的选择粗看问题不大,如果应用不需要公开提供浏览访问,应该不会出现任何性能问题。

但是,如果我们仔细观察服务响应,会发现有一些请求的响应的时间非常长,比如页面资源、比如对于页面至关重要的 JS 程序资源,它们的获取都消耗了接近 400ms。

Flare应用前后端性能优化问题分析

Flame 网络请求记录

此外,前端发起了多次请求来获取数据,结合数据存储使用 SQLite,如果提供公开内容访问,很容易遇到性能瓶颈。

针对应用进行改进

当我们清楚了解到上面的问题之后,比如容易采取的方案是:基于原程序进行重构调整,简化前端请求、合理拆分模块、处理资源加载和执行时机,调整数据存储和处理方式,提高服务端响应能力等组合拳。然而,这会是最简单和收益最高的方案嘛

调整前端实现

如果说在需要交互的页面程序中使用 MVVM 框架会有较高的收益和性价比,那么在缺少多端组件代码复用、没有服务端渲染需求的场景下,使用这类框架则是一个性价比不高的选择。

或许有同学会问,如果不使用 React、Vue、Angular 这类框架,难道在 2022 年还要再拾起 jQuery 等老的工具吗?虽然可以,但其实在近乎于纯展示的场景下,我们可以脱离 JS 来实现业务功能和简单的交互,比如自动获取焦点、菜单按钮的激活状态变化、甚至是带有动画效果的天气图标。

所以,在调整实现的时候,其实还有一个选择:不使用任何脚本

Flare应用前后端性能优化问题分析

Flare 无脚本实现的渲染效率

在完成程序之后,我们可以看到从服务器获取整个页面数据、结构解析、样式计算、元素布局、页面绘制的完整时间在 33ms(包含了 idle 等待时间),其中关键流程的时间消耗加起来不到 10ms,而完成页面渲染的时间更是缩短到了 1.65ms。

在得到了页面快速渲染能力之后,即使不使用浏览器针对资源进行缓存,加速渲染,我们也能够做到页面切换的“无刷新”浏览(因为渲染速度足够快)。

调整后端实现

虽然我非常喜欢使用 Node.js,以往也分享过你所未知的3种Node.js代码优化方式,但是,为了能够低成本提高高性能的资源响应,这里进行技术栈切换是必要的:比如 Golang。

在使用 Golang 简化程序功能后,程序对于每个请求的响应基本能够保持在几毫秒的水平(受限于网络传输),相比较之前大概下降了2~3个量级。页面关键的 DOM ContentLoad 时间更是缩短到原来的八分之一。

Flare应用前后端性能优化问题分析

Flare 优化过后批量请求状况

结合上面的前端优化提到的渲染时间来粗略估计,从资源下载到渲染加起来都不到 10ms,如果不是浏览器的一些限制,绘制帧率应该能够远超 60 帧,进一步满足我们实现“即使刷新了也比没一些没刷新的实现还顺滑”。

上面的实现中,我将页面图标请求和页面文档进行了拆分,在书签数量和图标种类不多的场景下,或许并不是最优的方案,但是一旦书签数量级到几百、上千之后,你会发现图标拆分可以极大地提升性能。

当然,为了满足数量比较少的场景,我也对合并输出进行了实现,算上网站 favicon 获取,一共只有两个请求。在书签不是很多的时候,渲染性能甚至比文档和资源拆分输出效率更好。

Flare应用前后端性能优化问题分析

Flare 请求合并模式下的网络请求

图标资源优化

Flame 使用的方案是读取后端接口配置,从前端脚本中动态创建 SVG 图标并插入文档中,Flare 程序默认的方式则是将 SVG 和文档拆分,以应对大量书签状况下的页面性能问题。

虽然解决了页面性能问题,但是服务端 IO 问题却会伴随而来,所以这里还需要处理资源在服务端的释放和读取问题,尽量将资源的磁盘 IO 变为零。

听起来比较玄乎,但其实结合代码生成的方式,还是蛮好实现的。当然,因为 Go 存在自动 GC,所以在不同的资源被使用的时候,会出现大量内存的分配,影响效率,这里可以考虑使用持久化方案来解决问题,处理起来挺有意思的,受限于篇幅和主题就不展开啦。有一部分我在前两篇文章中提到了,关于 Golang 嵌入资源的使用和优化。

Flare应用前后端性能优化问题分析

前段时间折腾 Go Emed 的记录

比如,在不针对 HTTP 服务实现做任何优化、限制运行资源为两核心的前提下,仅优化资源 IO 后,能达到稳定 3ms 输出资源,每秒提供2万7千次以上的响应服务。

容器镜像的优化

除了常规优化之外,容器时代的应用,镜像优化也是非常关键的。容器优化方式,我在前面的文章反复提过多次,所以也不再展开了,感兴趣可以自行翻阅之前的内容。

# docker images | grep fla                 soulteary/flare       0.1.1      22b18ad73c66        12MBsoulteary/flaume      2.2.0      b39fffc0ca81        152MBpawelmalak/flame      2.2.0      fa47c93c0af6        179MBpawelmalak/flame      2.0.0      729b0fcea7f0        190MB

可以看到,相比较原版程序,优化后的程序在本地解压后的尺寸大概是之前十五到十六分之一。

额外的优化

如果我们使用 lighthouse 针对 Flame 前端实现进行测试,能够看到前端程序在实现上的一些小问题,得分虽然四个环绿三个,但是只有一个环是绿色的。

Flare应用前后端性能优化问题分析

Flame 应用 Lighthouse 得分

在重新实现的过程中,除了简化结构,调试实现之外,还顺手将这四个圈都打到了满分(Chrome 版本 v97+)。

Flare应用前后端性能优化问题分析

到此,相信大家对“Flare应用前后端性能优化问题分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flare应用前后端性能优化问题分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flare应用前后端性能优化问题分析

本篇内容主要讲解“Flare应用前后端性能优化问题分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flare应用前后端性能优化问题分析”吧!写在前面在聊 flare 之前,我想先聊聊 flam
2023-06-29

优化网站性能的实战经验分享:从前端到后端的全面应用

从前端到后端:全面优化网站性能的实战经验分享近年来,随着互联网的快速发展,网站的性能优化变得越来越重要。用户对网站的访问速度和响应时间要求越来越高,优化网站性能已经成为每个开发者都应该关注的重要任务。本文将分享一些实战经验,帮助开发者全面
优化网站性能的实战经验分享:从前端到后端的全面应用
2024-02-03

Linux性能问题分析流程与性能优化思路

除了性能分析外,很多时候,我们还需要对系统性能进行基准测试。
Linux优化2024-12-01

用户自己制造了性能问题,还怪我前端没做优化?

如果是比较普通的场景还是可以用用一般防抖的,就比如某一个页面内的 Tab 切换,因为这一类的 Tab 切换说到底就是在同一个页面组件下去写代码逻辑,所以也比较好控制这些 Tab 切换后的防抖处理。
性能场景Tab2024-11-29

Java应用性能优化整体思路分析

在软件开发领域,性能优化不仅是一项挑战,也是提升用户体验、系统稳定性和企业竞争力的关键。尤其对于Java应用来说,由于Java的跨平台特性和广泛的应用场景,性能优化变得尤为重要。
Java开发2024-11-30

Web前端性能优化之资源合并与压缩的示例分析

这篇文章将为大家详细讲解有关Web前端性能优化之资源合并与压缩的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。资源合并与压缩两个目的减少http请求数量减少请求资源的大小google首页案例学习h
2023-06-08

前端性能优化之从URL输入到页面加载过程分析

在页面加载到最终渲染显示大致是这样的:用户在浏览器输入URL回车后,浏览器为了将URL解析成IP地址,会向DNS服务器发起DNS查询,获取IP地址。
URL前端页面2024-12-02

PHP 应用程序性能优化中的日志分析与性能改进

日志分析是应用程序性能优化中识别瓶颈和改进的关键步骤。为了优化缓慢的 php api 端点,需要:启用 php 日志;分析日志以识别错误和警告;优化数据库查询以提高速度;使用 apm 工具持续监控应用程序性能。PHP 应用程序性能优化中的日
PHP 应用程序性能优化中的日志分析与性能改进
2024-05-04

Python性能分析,使用cProfile可视化并解决性能瓶颈问题

Python标准库已经提供了性能分析所需的工具,即cProfile。本文将向你展示如何使用cProfile,以可视化的方式快速识别代码中哪些部分计算开销最高,并且应该优先进行优化。

分析Golang变量逃逸现象的性能问题及其优化方法

Golang变量逃逸原理解析与性能优化引言:在Golang程序中,变量的逃逸是一个常见的问题,影响着程序的性能和运行效率。本文将深入探讨Golang变量逃逸的原理,并给出一些性能优化的建议。同时,我们还将提供具体的代码示例,帮助读者更好地
分析Golang变量逃逸现象的性能问题及其优化方法
2024-01-18

使用Docker Compose、Nginx和MariaDB优化PHP应用程序的性能问题

在开发和部署PHP应用程序时,经常会遇到性能问题。为了解决这些问题,我们可以利用Docker Compose、Nginx和MariaDB来优化应用程序的性能。Docker Compose是一个用于定义和管理多个Docker容器的工具。它可以
2023-10-21

PHP 应用程序性能优化的关键问题和解决方法

php 应用程序性能优化的关键问题包括:慢速数据库查询:使用索引、优化查询和缓存查询结果。内存限制:使用内存分析工具、增加内存分配和优化代码。慢速网络请求:使用缓存、优化并行请求和启用 http 压缩。i/o 操作:优化文件 i/o、使用异
PHP 应用程序性能优化的关键问题和解决方法
2024-04-30

深入解析前端网站性能优化模式:提升用户体验流畅度

在当今互联网发展日新月异的时代,前端网站的性能优化越来越受到重视。随着移动互联网的普及和网站内容的增加,用户对网站性能的要求也越来越高。因此,对于前端开发人员而言,学习和应用网站性能优化模式是至关重要的。一、加载速度优化压缩文件:将网站的
深入解析前端网站性能优化模式:提升用户体验流畅度
2024-02-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录