性能优化就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。
产品筛选
(根据你公司情况筛选适合的产品)
为你找到
2
款产品
常见问题
性能优化通用方法
缓存:没有什么性能问题是缓存解决不了的,如果有,那就再加一级缓存。缓存的本质是加速访问,需要用空间换时间,在缓存空间有限的情况下,需要优秀的置换换算来保证缓存有较高的命中率。并发:一个人干不完的活,那就找两个人干。并发既增加了系统的吞吐,又减少了用户的平均等待时间。这里的并发是指广义的并发,粒度包括多机器(集群)、多进程、多线程。惰性:将计算推迟到必需的时刻,这样很可能避免了多余的计算,甚至根本不用计算。批量:在有IO(网络IO,磁盘IO)的时候,合并操作、批量操作往往能提升吞吐,提高性能。更高效的实现:同一个算法,肯定会有不同的实现,那么就会有不同的性能;有的实现可能是时间换空间,有的实现可能是空间换时间,那么就需要根据自己的实际情况权衡。缩小解空间:缩小解空间的意思是说,在一个更小的数据范围内进行计算,而不是遍历全部数据。索引就是其中一种,通过索引,能够很快定位数据,对数据库的优化绝大多数时候都是对索引的优化。其他如权限校验,排除超过权限范围的数据也是常用的方法。性能优化注意事项
性能优化的目的,就是为了提供给用户更好的体验,这些体验包含这几个方面:展示更快、交互响应快、页面无卡顿情况。在用户输入url到站点完整把整个页面展示出来的过程中,通过各种优化策略和方法,让页面加载更快;在用户使用过程中,让用户的操作响应更及时,有更好的用户体验。对于前端工程师来说,要做好性能优化,需要理解浏览器加载和渲染的本质。理解了本质原理,才能更好的去做优化。所以我们先来看看浏览器架构是怎样的。性能优化常用工具
性能优化其实就是找出应用存在性能瓶颈点,然后设法通过一些调优手段去缓解。性能瓶颈点的定位是较困难的,快速、直接地定位到瓶颈点,需要具备下面两个条件,恰到好处的工具和一定的性能优化经验。一、应用codeReview工具1、StrictMode:检测应用主线程不规范代码。2、Lint:AS中提供的代码分析工具,它能够检查出代码当中存在的问题,定义该问题的严重程度,并给出相应的解决方案,这样我们就可以快速地定位和修复问题。如果自定义一套Lint检测工具,那非常强大。二、内存问题分析工具1、Allocation Tracker 查看堆内存分配情况,可以直接跳转源码2、Heap Viewer:查看堆内存分配数据,提供初步判断3、命令 android:内存分析系统开发必备,当然,对app内存分析也是非常不错的帮手4、对cpu、memory、network进行更全面直观的分析,属于androidProfiler monitor加强版性能优化一般性原则
1、依据数据而不是凭空猜测怀疑性能有问题时,应通过测试、日志、profillig等手段分析哪里出现了问题。有可能是CPU、内存、IO(磁盘IO,网络IO)等,定位大方向可以使用top及stat系列来定位(vmstat,iostat,netstat等),针对单个进程,可以使用pidstat分析。2、忌过早优化在典型的互联网应用开发与编程模式下,追求的是快速迭代与试错。过早优化往往是无用功,而且过早优化很容易导致优化的点不是真正的性能瓶颈。3、忌过度优化性能优化的目标是追求合适的性价比。4、深入理解业务代码是服务于业务的,也许是服务于最终用户,也许是服务于其他程序员。不了解业务,很难理解系统流程,很难找出系统设计的不足之处。5、性能优化是持久战当核心业务方向明确后,应该开始关注性能问题。当项目上线后,更应持续进行性能检测与优化。现在的互联网产品,在上线之后还需持续开发。用户的涌入会带来性能问题,因此需要自动化检测性能问题,保持稳定的测试环境,持续的发现并解决性能问题,而不是被动地等待用户投诉。6、选择合适的衡量指标、测试用例、测试环境性能优化是一个长期的行为,需要固定衡量指标、测试用例、测试环境,才能客观反映性能的实际情况,展现优化效果。衡量性能的指标有以下几个,比如:系统响应时间、系统吞吐量、系统并发量。不同的系统核心指标不一样,首先要明确系统的核心性能诉求,固定测试用例;其次也要兼顾其他指标。性能优化层次
性能优化的层次可以分为需求阶段,设计阶段,实现阶段。越上层的阶段优化效果越明显,同时也更需要对业务、需求的深入理解。需求阶段程序员的需求可能来自PM、UI的业务需求(或者说是功能性需求),也可能来自Team Leader的需求。拿到一个需求时,首先需要思考、讨论需求的合理性,而不是立刻去设计、去编码。需求是为了解决某个问题,问题是本质,需求是解决问题的手段。需求讨论的前提是对业务的深入了解,即使需求已经实现了,当我们发现性能有问题的时候,也可以从需求出发。需求分析对性能优化的帮助:1、为了达到同样的目的,解决同样的问题,也许可以有性能更优(消耗更小)的办法。这种优化是无损的,即不改变需求本质,又能达到性能优化的目的;2、有损的优化,即在不明显影响用户体验的条件下,稍微修改需求、放宽条件,就能大大解决性能问题。设计阶段设计包括架构设计、技术选型、接口设计等等。架构设计约束了系统的扩展、技术选型决定了代码实现。编程语言、框架都是工具,不同的系统、业务需要选择适当的工具集。如果设计的时候做的不够好,那么后面就很难优化,甚至需要推倒重来。实现阶段实现是把功能翻译成代码的过程,这个层面的优化,主要是针对一个调用流程,一个函数,一段代码的优化。各种profile工具也主要是在这个阶段生效。除了静态的代码优化,还有编译时优化,运行时优化。代码层面,造成性能瓶颈的原因通常是高频调用的函数、或者单次消耗非常高的函数、或者二者的结合。
大家都在问