浅谈面向客户端的性能优化

浅谈棋牌游戏开发流程一:客户端技术——从无到有,让玩家真正“看得见、摸得着” 在构建一款棋牌游戏时,客户端的作用往往非常关键——因为它直接面向玩家,是“眼见为实”的那一部分。本篇文章,咱们就来系统聊一聊:接下来,咱们一步一步看下去。无论是斗地主、麻将,还是德州扑克,玩家最终看到的一定是各种画面和交互逻辑:点击按钮、出牌、动画特效、结算界面等。而这所有的一切,都得在客户端上去实现。可以这么理解:玩家体验: 玩家跟游戏的互动,几乎全都发生在客户端上。比如想要叫地主、使用道具、跟好友聊天,统统需要一个界面和对应的交互逻辑。很多时候,玩家会根据客户端的流畅程度和美观程度,来判断这款棋牌“专 阅读详情

有朋友通过《智能音箱场景下的性能优化》一文找到了我,既然智能音箱的性能优化相当于一个超集,那么对其的一个子集——客户端系统如何进行性能优化呢?

反正隔离在家,不妨对客户端的性能优化梳理一下。

我思故我在

首先,回顾一下性能优化。性能优化是面向时间的艺术,简单的说,就是在不影响系统正常运行的前提下,执行得更快,完成特定功能所需的时间也更短。关于性能为王的更多描述,可以参考《深入分布式缓存》一书。

客户端系统的性能优化可能是一种不太准确的说法,所有的性能优化都是为了更好的用户体验,客户端系统的性能优化大概是指如何优化客户端系统已获得更好的用户体验。然而,客户端不是独立存在的,面向客户端系统的性能优化同样需要服务端的配合才成。

既然是提升用户体验,就需要抓住重点,哪些才是性能问题的关键部分呢?客户端系统在应用整体性能中处于怎样的地位呢?客户端优化对整体性能的影响大么?

实际上,很多时候,性能的瓶颈确实是在客户端,老码农对经历的多个系统进行过时延分布的统计分析,客户端对整体性能的影响接近80%,又一个二八原则出现在了面前。

也就是说, 客户端的性能优化大概率对系统性能有着决定性的影响。

客户端的性能分析

客户端又有着宽泛的概念,和大前端类似,包括了App,Web前端,小程序以及hybrid App等等。客户端的性能优化同样需要找到关键指标,用数据说话,并实现可持续的优化,监控、记录、分析、优化的这一路径依然有效,而且必然有效。

用户使用客户端,在与客户端交互之后,等待客户端从后台服务器获取内容并呈现:

  1. 客户端的本地预处理

  2. 网络处理:包括查询DNS,建立连接,发送请求到服务器,并等待响应

  3. 可能是用户在客户端上的白屏时间,当然可以用本地缓存来改善体验

  4. 客户端开始接受数据,解析内容

  5. 对一般的前端而言,客户端将读取缓存,并执行JavaScript/CSS等,这对于用户的首屏时间

  6. 客户端处理数据,计算布局,并开始渲染屏幕等,这时用户就处于可操作的状态了。 

以Web前端为例的话,白屏时间一般到结束,首屏时间到首屏图片加载结束,用户可操作时间要到DOMReady/核心JS加载完毕。

因此,客户端的性能优化可以分为两大部分:面向网络通信的优化和面向客户端自身的优化。

面向客户端的网络优化

根据一般的经验, 网络通信是系统的性能瓶颈,IO慢,而最慢的IO就是网络通信。网络性能优化主要包括:减少网络请求的次数,减小网络请求的流量大小和提升网络请求速度。

减少网络请求次数

削减请求次数是提升通信性能的必经之路,就Web前端而言,过往的一些经验是

  • 少使用iframe,避免404和空的src

  • 缓存Ajax的结果,尽量使用Ajax GET

  • 域名拆分,减少DNS查询次数

  • 避免跳转,减少HTTP连接

  • 采用延迟加载和预加载

减少请求次数往往涉及到业务流程的改造,或者涉及协议的合并与重组,有时候,还会和减小网络请求内容大小的方法相冲突。

减小网络请求的流量大小

网络请求的负载一般是很难减小的,相反,随着业务的增长,协议的膨胀,网络请求的内容大小还会增长。对于网络请求的净负载而言,序列化可以在一定程度上压缩数据内容的大小,例如使用protobuf。

另一方面,由于gzip几乎已经成为了基础配置,所以网络请求中的具体数据会采用gzip压缩,并在压缩后传输,然后在客户端上解压处理。特别地,对图片而言,可以使用webp等格式对图片进行压缩,或者使⽤CSS Sprites也是一种办法。

既然网络中的数据内容难以减少,就要尝试减少内容的无效传输。这是缓存技术的又一典型应用, 服务端配置Expire/cache-control,配置ETags等等都基本上是规定动作了。

提升网络请求速度

网络带宽一直是短缺资源,但并不是我们无法提高网络请求速度的借口。例如服务端可以尽早flush数据,使用CDN更是不二法门,尤其是全站CDN,有时候能解决大部分的性能问题。

根据长短连接的特点,在客户端选择长短连接同样可以在一定程度上提高请求的速度。一般地,长连接适用于点对点通信,节省TCP建立的耗时,在首次建立连接后,多次交互复用;短链接适用于高并发通信,节省socket资源,每次交互重新建立链接。

对于Web前端而言,了解浏览器所支持的连接数,可以帮助我们在带宽充足的情况下同时使用多个连接进行通信。

浏览器HTTP1.0HTTP1.1
Chrome66
Firefox66
IE866
Opera44
Safari44

表中的数据大约是4年前的了,仅起到参考作用,技术演进很快,目前的浏览器对连接数有着自己规定和限制。

同时,连接池有时是性能优化的必然选择。如果每个请求都会发起一次连接的话,会:

  • 增加延迟:域名解析、TCP握手、SSL握手、TCP慢启动

  • 消耗流量:域名解析、握手挥手等

建立连接池可以保存空闲连接,请求优先去连接池找空闲连接,连接池命中失败再发起新连接,可以实现Socket Late Binding,具体可以参考《从连接池到内存池》。

面向客户端的自身优化

客户端自身的优化,除了业务逻辑的优化之外,主要是缩短显示布局和渲染的时间,让用户感觉上“更快”。

web 优化

就web前端而言,如果使用了cookie, 需要考虑cookie大小,静态域名最好不带Cookie。提升CSS的性能,一般在代码中置顶CSS,使用代替 @import ,避免CSS表达式和Filters。在SPA类型的应⽤中,要减少CSS的3D加速,减少CSS往往比减少Javascript更重要,因为渲染的时候内存往往比CPU重要。

Javascript 的优化方式一般是前端工程师所熟知的,例如,脚本置底,JS和CSS外联,压缩并去掉重复脚本,减少DOM操作,使⽤事件代理等等。进一步,是数据结构和算法的优化,例如,减少查找,避免with、eval和动态改变对象属性,使用数组来进⾏字符串拼接等等。

另一个有效的方式是减少DOM的数量,但实际上这对设计的要求很高。但是,Anyway,要减少DOM的重绘触发,避免访问 childNode的 数组,采用读写分离,收回并重复利用DOM,缓存数据⽽不是DOM本身。

App 优化

一般地,App 比web前端更能充分地利用端能力。Web页面的生命周期较短,一般是单线程,而且持久化能力较弱。App UI 的生命周期更长,支持多线程,有工作的优先级,具备较强的持久化能力。

App 的优化一般包括预加载内容以及首图, 最小化首屏网络请求。根据用户操作,提前预判处理。同样,可以预先下载资源包,将资源静态化上CDN。App可以通过端做连接加速(如长连接),SDK提前装载以缩短初始化时间,并对图片等资源进行缓存。

App同样可以包含Hybrid 的形式, 对类web的呈现可以通过模板本地化来预渲染,可以预初始化webview,预取端能力的执行结果。为了减少Javascript与Native 的交互,可以使用React Native来完成渲染,可以使用户体验得到一定的优化。

当然,App还可以对内核做针对性的优化。

客户端的性能评估

性能优化和策略工程是类似的,没有效果评估的性能优化都是耍流氓。

但是,客户端的性能评估存在着一些挑战,例如除了客户端程序之外,还有其它程序在运⾏,JS引擎也有着JIT等动态优化,还有着各种不可⻅的缓存(如I/O、CPU cache等)。性能的评估多是基于日志埋点,一个良好的日志埋点系统最好能过支持按需定制的后埋点配置方式。对于客户端系统而言,还可以有其他多种测量和评估的手段。

性能问题的定位主要是模拟出现问题的场景,如高并发,高负载情况下的系统反应。对服务端而言,一个性能测试平台,尤其是压测系统,一般提供两个功能,压力产生和数据收集。数据收集模块负责收集数据,支持用户自定义的数据收集逻辑。压力产生的模块负责多进程的管理,执行用户的发压逻辑(如rpc,数据库操作),支持自定义发压逻辑。例如,可以在里面实现一个写数据库的操作,也可以实现一个读文件的操作等等。

通过压测,可以发现稳定性的问题,包括并发操作/访问带来的接口内部逻辑的异常(如多线程逻辑异常,死锁,内存泄漏等),更主要的是发现性能问题,包括吞吐量,qps是否达到上线流量的要求等等。

对于客户端而言,一般采用类似Monkey那样的压测工具,或者编写定制的测试工具来进一步完成对性能的评估。对于类似手机上的应用软件,一般会压测72小时,当然,最少也要压测4~8小时。

另外,客户端系统的性能优化除了运行速度之外,还有对端上电量、CPU/内存等资源的考虑,从系统层面来看,都属于性能优化的范畴。

参考资料与关联阅读

浅谈语言模型推理框架 vLLM 0.6.0性能优化 上优刻得AI推理平台,享极速推理体验! 优刻得AI推理平台上线高性能推理服务框架vLLM,新版vLLM升级「服务推理进程分离」、「多步调度」、「异步输出处理」等机制,以降低CPU争抢开销、减少GPU空闲等待,并使得模型推理和输出处理异步进行。通过不断优化硬件资源利用率,让模型推理更高效。 阅读详情

相关推荐

《客户端性能分析与优化入门.pdf》

在原部门写的《客户端性能分析与优化入门》,分享出来,希望能得到大家的认可~

客户端性能优化和什么是CDN

优化代码执行效率:通过采用更高效的算法、避免重复计算、减少DOM操作等方式,可以提高JavaScript代码的执行效率,从而提高整个页面的性能。延迟加载:对于某些非必要资源,如广告、社交分享按钮等,可以采用延迟加载的方式,在页面完全加载后再异步加载,避免影响整个页面的加载速度。减少重绘和回流:通过合理使用CSS样式、避免频繁操作DOM元素等方式,可以减少浏览器的重绘和回流次数,从而提高页面性能。图片优化:通过压缩图片、选择适当的图片格式、使用图片懒加载等方式,可以减小图片的大小和数量,降低页面加载时间。

T3165919332的博客 337

从四分钟到两秒——谈谈客户端性能优化的一些最佳实践

最近跟售后经理吃饭,他跟我再次谈起两年前为公司临时写的一个客户端,仍然非常激动的跟我说,这个客户端完爆了公司其他版本的客户端,包括最老的Delphi写的,Asp.Net写的,以及最新的Wpf写的客户端。无论是多么大的界面(集成的机房多),这个系统都是瞬间打开,而且运行非常稳定,一旦成功部署之后基本没有任何问题。这个版本的客户端仅仅只是一个临时替代的版本:原来的Delphi客户端实在是太慢了,在大型的数据中心监控中需要4~5分钟才能进入主监控界面,而asp.net版本的客户端又经常存在不稳定的情况(IE浏览器不支持7*24小时的异步刷新),最新的Wpf客户端又还在设计阶段,于是临危受命决定开发一

软件测试学员求职面试准备-第6天(性能测试综合篇)

1. 性能测试流程 2. 需求分析 测试对象:常用的核心业务,数据量、并发量较大,比如:注册,登录,搜索,添加购物车,下单,支付 性能指标:要求 500 万用在 8 小时内完成 测试场景:单一场景,测试某一个单一功能, 混合场景,多功能组合的场景,多业务测试 3. 测试计划 测试目标、测试人员安排、测试进度安排 压力机选择:配置、要求,数量 风险 4. 测试方案 测试工具:jmeter。loadrunner 测试环境:数据库,服务器,架构设计,有条件下尽量和生产环境(线上环境)一致 测试...

JCY58的专栏-软件测试服务网 997

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3789

Vivado+VCS+Verdi三件套实战:如何高效仿真AXI VIP并快速查看波形

本文详细介绍了如何利用Vivado+VCS+Verdi工具链高效仿真AXI VIP并快速查看波形。通过环境配置、Vivado工程准备、VCS编译与仿真优化以及Verdi波形分析技巧,实现仿真速度的数量级提升,显著提高FPGA开发效率。

red88的博客 999

客户端性能优化

客户端性能优化是一个综合性的过程,涉及资源管理、渲染优化、网络请求优化、代码优化、用户体验优化以及性能监控等多个方面。通过合理应用这些策略,可以显著提升应用的响应速度和用户体验,确保用户在使用过程中获得流畅和愉悦的体验。定期评估和优化是保持应用性能的关键,开发者应持续关注性能指标并进行相应的调整。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 455

采购订单定价策略 超详细

‘需求’字段里填写的是一个例程编号(例程是一段判断程序),如果我们在需求中维护了例程编号,那只有这个例程条件被满足时,这个条件表才会被系统自动读取。一部分的条件表只有在凭证项目满足一定的条件时才会被读取。 ‘排斥的’字段如果别勾中的话,那表明如果这个条件表被系统成功读取到数据后,系统将停止这个存取顺序的执行,否则,系统将继续执行下去。 注意:a、如果我们给某个条件类型设定了有效期的话,那我们必须给这个条件类型分配一个存取顺序。 b、不能给一个抬头条件分配存取顺序。 是...

竹大的博客 1万+

如何理解高性能服务器的高性能、高并发?

作为国内品牌服务器厂商,蓝海大脑液冷GPU服务器拥有大规模并行处理能力和无与伦比的灵活性。它主要用于为计算密集型应用程序提供足够的处理能力。GPU的优势在于可以由CPU运行应用程序代码,同时图形处理单元(GPU)可以处理大规模并行架构的计算密集型任务。GPU服务器是遥感测绘、医药研发、生命科学和高性能计算的理想选择。

LANHYGPU的博客 1349

BIM模型导入SuperMap

目录 一、超图 BIM插件安装 1.1 插件下载 1.2 安装 二、BIM模型导出 2.1 Revit插件导出 2.2 SuperMap导入工具 三、SuperMap BIM数据处理与服务发布 四、SuperMap三维数据处理中关于模型高程修改方法 一、超图 BIM插件安装 1.1 插件下载 下载链接:http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?tt=ProductAAS&id=134 1..

爱晒太阳的风 3596

python利用IQR方法与3σ方法进行异常值处理(含代码)

python利用IQR方法进行异常值处理

weixin_46713695的博客 2031

滴滴数据中台、海外架构、客户端性能优化等技术分享

滴滴出行在系统架构、客户端性能优化、安全准入、国际化业务架构、数据中台方面,有深厚的技术积累。2019年12月6-7日,在北京举办的ArchSummit全球架构师峰会上,滴滴出行技术副...

DiDi_Tech的博客 1778

最新Python爬虫实战(入门爬虫篇)——案例18:某气象局全国天气预报数据采集(详细爬虫思路截图 + 抓包动图演示+完整爬虫代码+详细注释)

本次案例针对某气象局天气预报网的静态HTML页面,实现了全国各地区天气数据的全自动化爬取,和之前案例17的动态接口爬虫不同,本次案例聚焦于静态页面的爬虫实现,覆盖了从抓包分析、请求模拟、数据解析到数据存储的完整爬虫流程,非常适合入门学习者巩固基础,核心知识点和实现要点总结如下:首先是页面分析的核心逻辑,静态HTML页面的数据爬取,核心在于通过浏览器开发者工具,完成完整的抓包分析和标签结构定位。

努力让自己发光,对的人才能迎着光而来 27万+

浅谈性能优化

参考《大型网站技术架构》,其中包含一些个人理解,如有错误或说的不清楚的地方,请一定指出,谢谢。 这篇文章讲的比较浅,如果有更深入的需要,欢迎留言或是查阅资料。 在谈性能优化之前,我们先来看一看什么是性能。 网站性能是客观的指标,可以具体体现到响应时间、吞吐量等技术指标;同时也是主观的感受,而感受是一种与具体参与者相关的东西,用户间的感受、用户与工程师间的感受都是不同的。 用户感受到的响应时...

喜码拉雅 261

【数字IC基础】DFT(Design For Test)可测性设计

【数字IC基础】DFT(Design For Test)可测性设计

努力,加油每一天鸭~ 3465

2026华为OD机试(JAVA&Go)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Java实现。

MISAYAONE的博客 34万+

浅谈产品体验优化

1.产品体验 1.1 易懂(能用) 场景化 结构化 易理解 1.2 易操作(易用) 简约 不干扰 一致性 常规化 1.3 超预期(好用) 美感 潮流 2.常见问题 2.1 企业应用复杂,功能重要,页面要怎么取舍 场景化设计:面向场景,才能取舍 沉浸于场景,才能感同身受 对待用户,少即是多:不堆砌功能,功能服务于场景和整体体验 好的解决方案都是优雅的,如果解决方案非常复杂,...

逍遥云恋 1277

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

浅谈对消息队列的理解

MQ消息队列的理解写 浅谈对消息队列的理解 消息队列:我们可以把消息队列看成一个存放消息的容器,当我们需要时可以从直接容器内获取使用即可。 使用消息队列主要是为了异步通讯处理消息来提高系统性能、削峰\降流、系统间解耦的作用 消息队列的作用(为什么要使用消息队列) 有以下三个好处 通过异步处理提高系统的性能(减少响应的时间): 当客户端访问服务器的时,将用户的耗时较长的请求成功放到消息队列里后就直接响应客户端,随后系统在慢慢消费消息从而减少客户端响应时间。 场景:系统将用户的的请求信息放到消息队列后,直接响

Maker_Wei_DADA的博客 311

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

『网络』浅谈TCP协议

TCP概述。TCP首部。TCP特点。确认应答机制。超时重传机制。连接管理。TIME_WAIT状态。解决TIME_WAIT引起的bind失败问题。滑动窗口。流量控制。拥塞控制。延迟应答。捎带应答。面向字节流。粘包问题。基于TCP应用层协议。几个常见的问题。

叄拾叄画生 877

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

框架设计:浅谈ECS设计思想(一)

简要介绍ECS的实现和作用,并阐述其于传统OOP相比的优劣。

xiegy_august的博客 4611

浅谈web前端开发

有部分同学和朋友问到过我相关问题,利用周末我就浅浅地谈谈我对web前端开发的理解和体会,只能浅浅谈谈,高手请自动跳过本篇文章。毕竟我现在经验并不是很足,连工程师都算不上,更不用说大牛了。今天也不谈技术,技术很多人比我掌握得更好,也大同小异,但是每个人的理解体会是不一样的。 ...

chuocui9077的博客 471

浅谈NIO零拷贝

简介 在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,面向流的I/O速度非常慢,而在Java 1.4中推出了NIO,这是一个面向块的I/O系统,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据库,按块处理要比按字节处理数据快的多。 NIO和IO的主要区别 在NIO中有几个核心对象需要掌握:缓冲区(Buffer)、通道(Channel)、选择器(Selector) 通道(Chan

yangxiaoboQAZ1的博客 324

浅谈JDBC 基础总结

JDBC 持久化概述 持久化(persistence)**: 把数据保存到可掉电式存储设备中以供之后使用。 数据持久化意味着将内存中的数据保存到硬盘上加以”固化” 而持久化的实现过程大多通过各种关系数据库来完成, 将内存中的数据存储在关系型数据库中 当然也可以存储在磁盘文件、XML数据文件中 而在 Java中,数据库存取技术只能通过 JDBC 来访问数据库。 JDBC 访问数据库的形式主要有两种: 1. 直接使用 JDBC 的 API 去访问数据库服务器 (MySQL/Oracle). 2. 间

weixin_47057820的博客 1677

Redis持久化之 RDB 和 AOF 浅谈

Redis提供的持久化机制    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能、持久存储、适应高并发应用场景等优势。它虽然起步较晚,但发展却十分迅速。 近日,Redis的作者在博客中写到,他看到的所有针对Redis的讨论中,对Redis持久化的误解是最大的,于是他写了一篇长文来对Redis的持久化进行了系统性的论述。 文章主要包含三个方面:Red...

weixin_41380972的博客 184

2020年末:浅谈阿里前端的多样化

2020年,互动技术也成为阿里经济体前端技术的重点发力方向。 以淘系互动技术为例,它构建在一个大型、完备的前端基座上:一体化的工程、构建、容器、框架、发布系统、渲染引擎。 互动前端技术的核心简单地大概分为三部份: **(互动)框架:**基于游戏领域的通用构架,自底到顶的分层实现-Render/Render OBJ/Design Pattern/Utils,具备加载器、ECS、场景、插件化扩展等基础能力。 **(互动)素材中心:**接收并处理互动展示层所需要的资源并输出成型的互动素材,并通过SaaS化

m0_67619362的博客 234
上一篇: “格物致知”的谜思
下一篇: 人工智能伦理学的一知半解
半吊子全栈工匠
半吊子全栈工匠 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄18年 4632粉丝 897原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值