性能优化方法论.pdf
《性能优化方法论.pdf》由会员分享,可在线阅读,更多相关《性能优化方法论.pdf(55页珍藏版)》请在咨信网上搜索。
1、目录一、前言51.1 关于本书51.2 关于作者5二、性能优化的本质72.1 性能优化的根本目的是什么?72.2 出现性能问题的主要原因72.3 性能优化的核心环节82.4 寻找性能瓶颈8三、性能优化方法论的思想源泉103.1 核心思想103.1.1 开源和节流103.1.2 堆“硬件”、升“软件”103.1.3 权衡(trade-off)113.2 具体来源113.2.1 经典论断123.2.2 百花齐放13四、性能优化的核心思想144.1 增加资源144.1.1 增加机器144.1.2 升级配置154.2 减少耗时操作164.2.1 合并操作(化零为整)164.2.2 压缩214.2.3
2、复用224.2.4 减少 IO 操作234.2.5 减少上下文切换264.2.6 减少操作指令264.2.7 合理设置等待时间284.3 提高资源利用率284.3.1 空间换时间284.3.2 同步转异步384.3.3 串行转并行394.3.4 降低冲突的范围404.3.5 空间局部性424.4 其他424.4.1 提前处理424.4.2 实时转离线434.4.3 随机读写转顺序读写434.4.4 就近原则434.4.5 选择合适的数据结构和算法444.4.6 加限制条件(技术层面)444.4.7 CPU 密集型和 IO 密集型454.4.8 根据技术特点去优化454.4.9 全链路优化464
3、.4.10 多种手段相结合464.5 产品层面474.5.1 加限制条件(产品层面)474.5.2 砍需求48五、注意事项495.1 避免过早优化495.2 考虑其他指标495.3 优化体验50六、实际案例516.1 案例描述516.2 设计分析516.3 案例总结54七、总结555一、前言一、前言1.1 关于本书本书主要分享自己在性能优化方面的一些思考。性能优化是 Java 程序员学习和工作进阶过程难以绕开的一个重要话题。很多人都想学好性能优化,希望能够在自己的工作中灵活运用,提升自己的技术水平,为用户提供良好的使用体验。然而,很多人在工作中设计技术方案或者编码时缺乏系统的、方法论级别的理论
4、指导,导致需要考虑性能优化的场景时,缺乏优化思路。俗话说:“授人以鱼不如授人以渔”,本文不仅会讲性能优化有哪些具体的方法,还会讲解思想的来源。本书会先讲述性能优化方法论的主要思想源泉,性能优化的本质;然后分别讲述性能优化方法论的核心方法,以及性能优化的注意事项等内容。讲解过程中会结合常见的 Java 中间件进行一些举例说明;最后会结合具体的案例,帮助大家理解性能优化方法论如何落地。希望大家能够通过本书的学习,掌握性能优化的核心思路,帮助大家可以举一反三,可以从性能优化角度去学习 Java 中间件,去设计合理的性能优化技术方案。1.2 关于作者网名:明明如月,微信:mingmingruyuexz
5、蚂蚁集团高级Java 工程师、阿里云开发者社区专家博主、CSDN 博客专家。一、前言二、性能优化的本质二、性能优化的本质2.1 性能优化的根本目的是什么?可能很多人没有认真思考过:“为什么我们需要进行性能优化?”这个问题。在我看来,性能优化是为了”解决良好的用户体验和资源的有限性之间的矛盾”。首先,我们性能优化一般都是追求更快的响应速度,通常最终目的是为了获得更好的用户体验。这里所说的资源是指广义上的资源,“资源的有限性”包括:资金成本的有限性,人力资源的有限性,服务器等硬件资源的有限性,时间的有限性等。如果资源是无限的,如开发周期很长,投入的人力很多,服务器资源充足,甚至服务器内存是无限大的
6、,那么设计出来的产品可能就不需要花费太多精力去优化。2.2 出现性能问题的主要原因通常,产品发布早期由于用户量较少,不太容易出现性能问题或者通常不会太去关注性能问题;但随着业务的不断发展,性能问题就逐渐暴露出来。导致性能问题的原因有很多,常见的原因有:项目工期紧张,设计阶段技术方案考虑不充分;项目中使用了不合理的数据结构或算法;系统架构设计不合理;同步执行耗时任务;二、性能优化的本质二、性能优化的本质如使用 trace 命令,对某个耗时较长的接口进行分析:trace com.xxx.service.impl.AServiceImplrefresh,给出下面结果:根据上面的结果可以看出,com.
7、yyy.service.impl.AServiceImpl:refreshSomeThings 耗时最长,可以继续再 trace 耗时最多的子函数,最终定位到最影响耗时的函数上。找到耗时最长的环节之后,根据具体代码推断出耗时长的原因,然后再针对性地进行优化。优化后可以通过性能测试、压力测试等手段验证性能优化的有效性。三、性能优化方法论的思想源泉三、性能优化方法论的思想源泉其实性能优化的主要方法也来源于此,性能优化的宏观思路就是“堆硬件,升软件”。这里的硬件指机器的数量和机器的配置等;软件包括优化算法、架构等。本质上和开源节流的思想是一致的。3.1.3 权衡(trade-off)大家找工作很难找
8、到”钱多、事少、离家近”的工作。然而现实情况是,通常只能得其中一二。性能优化很多时候也是一种权衡,在性能优化的路上,通常要做:用户体验和成本的权衡,投入产出比的权衡。很多团队在产品研发初期人力资源有限,加上快速上线的压力,一般看重满足功能要求,只要不出现难以接受的性能问题即可。此外,项目也有优先级,可能另外一个项目优先级非常高,性能优化的事情可能就暂时延后。不管是通过”堆硬件”还是通过”升软件”的方式进行性能优化,都会面临着低延时和高成本的矛盾。然而一般来说,用户体验和成本成反比,架构师或者开发人员要做的是,根据产品发展阶段和资源的情况去考虑性能优化的问题。不管是从产品的发展阶段,还是团队内项
9、目的优先级,还是技术角度上性能优化的投入和产出比来说,性能优化都不是简单地追求”最优化”,而是需要结合实际情况寻找优化的平衡点。3.2 具体来源三、性能优化方法论的思想源泉三、性能优化方法论的思想源泉3.2.2 百花齐放此外,专业基础是性能优化灵感的重要来源,如 CPU 的多级缓存思想、文件缓冲区的思想、进程调度算法等。不同的数据结构都有自己的特点,都是为了解决某一类问题,适合某些场景,有其优缺点。选择合适的数据结构也可以实现性能优化。不同的算法的时间和空间复杂度也各不相同,选择性能更优的算法也可以提高性能。很多架构就是为了性能优化而设计的,如读写分离、分库分表、分布式架构;很多中间件的设计中
10、体现出诸多性能优化的思想,如 ES 的倒排索引、索引刷盘机制;JDK 源码和很多优秀的开源项目也包含着很多性能优化的典型实践,如内存缓存、分段加锁、写时复制等。四、性能优化的核心思想四、性能优化的核心思想通常很多站点都会在某些大型活动(如限时秒杀、微博热帖、高考查成绩、热门直播等)前或过程中,通过手动或者自动”扩容”增加更多机器的方式来支撑更多流量。4.1.2 升级配置增加配置,通常是更换性能更好的 CPU、增加内存、增加宽带、使用固态硬盘、增加磁盘空间等。下图为阿里云购买服务器页面的截图,其中的选项就是配置相关的关键指标。四、性能优化的核心思想四、性能优化的核心思想如下图所示,某个功能,需要
11、在循环中请求十几次甚至几十次二方或者三方接口:假设每次耗时 100ms,请求 20 次,就是 2 秒钟。如下图所示,可以通过调用批量接口,发起一次网络请求获取十几条数据或者几十条数据:同样的功能,可能 100 ms 更多一点就搞定了。很多中间件在设计时,也会提供一些批量接口。如 hbase-client 中就提供了批量查询接口:org.apache.hadoop.hbase.client.Table#get(java.util.List)四、性能优化的核心思想四、性能优化的核心思想Java 中也提供了如 java.nio.ByteBuffer 和 java.io.BufferedOutputS
12、tream 等。下面是 BufferedOutputStream 的源码注释:从注释中也可以看出,应用可以使用该类将字节写入到这里,而不是每个字节都调用底层写入方法,本质上就是合并请求。四、性能优化的核心思想四、性能优化的核心思想4.2.2 压缩对要存储或传输的数据进行压缩,可以减少资源占用,提高传输速率。比如前端可以对 js 或者 css 文件进行压缩,来减少传输的数据量,加快资源加载速度。也可以在使用资源时,默认对资源自动压缩。如通过微信发送图片或者视频时,默认会自动压缩,必要时可以选择原图进行发送。查看时只加载预览图,在必要时可以选择查看原图或者选择清晰度更高的视频。如 QQ 空间相册、
13、爱奇艺/B 站等视频的清晰度切换等。四、性能优化的核心思想四、性能优化的核心思想比如 Http 长连接就是在同一个连接中发起多次请求来提高性能的;数据库连接池,也是通过复用连接来提高性能的模式。4.2.4 减少 IO 操作下面只是给出几个实际中常见的具体案例,大家要根据实际情况进行举一反三。减少不必要的调用有时,前端由于架构设计不够合理等原因,会进行一些没有必要的同步调用,造成响应时间无辜被拖长。此时,需要去掉不必要的调用(尤其是同步调用)。做新的项目时,有时候需要协调多个下游,如果有些接口没有必要调用,就要减少调用。四、性能优化的核心思想四、性能优化的核心思想因此建议大家只打印必要的日志,对
14、于大对象只打必要的字段。减少不必要的转换比如有时候需要将内存对象持久化到一些 KV 存储中,由于有些序列化方式需要实现序列化接口,而有些对象没有实现序列化接口从而不支持某种二进制序列化方式,有些人会选择先进行 JSON序列化成字符串然后再进行存储,这样做性能很差。如果 KV 存储要求实现序列化接口,如果想要序列化没有实现序列化接口的二方或者三方 jar 包中的类,可以定义一个具有相同属性的类,转换后再进行序列化。四、性能优化的核心思想四、性能优化的核心思想大家动手用 javap 进行反汇编之后你会发现,如果当前函数多次使用 data 时,第一种写法指令更少。第一种写法,第一次将 data 对象
15、存储到当前栈帧的局部变量表中,使用时直接从局部变量表中获取,而第二种写法需要先装载 this 然后通过 getfield 方法来获取属性。想了解详细内容,可以参考我一篇专题文章:为什么推荐大家学习 Java 字节码有些前置判断应该放在尽量靠前面的位置,避免做了一系列不必要的操作。伪代码如下:四、性能优化的核心思想四、性能优化的核心思想空间换时间是性能优化最常用的手段之一。其中缓存就是空间换时间的一种典型应用。CPU 缓存、浏览器缓存、CDN 缓存、DNS 缓存、内存缓存、Redis 缓存等,它们都是将数据缓存在离使用者更近的地方,或者读取速度更快的存储介质中,通过空间换时间的方式实现性能优化的
16、。在展开讲解之前,大家想想如果电商平台自营商品都从中央仓库发货,近的用户收货时间会短一些,远的用户收货时间可能会很长。四、性能优化的核心思想四、性能优化的核心思想前面给出了不同系统组件的操作时差图,下面给出一张 CPU 缓存、内存和磁盘操作的时差参考图4。鉴于内存的读写速度比磁盘快很多,通常设计方案时会选择将热点数据缓存在内存中,这样就可以加快访问速度。HBase 会在 RegionServer 中包含 BlockCache,当读请求到 HBase 后,会先尝试查询BlockCache,如果获取不到再去 HFile 和 MemStore 中获取,如果获取到了该数据,则返回给上游的同时将 Blo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 性能 优化 方法论
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【Stan****Shan】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【Stan****Shan】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。