一文了解性能优化的方法

背景

在应用上线后,用户感知较明显的,除了功能满足需求之外,再者就是程序的性能了。因此,在日常开发中,我们除了满足基本的功能之外,还应该考虑性能因素。关注并可以优化程序性能,也是体现开发能力的一个重要因素。初级程序员可能仅满足于完成需求,但是若想走的更远,我们需要能够进行程序的性能优化。

性能优化方法总览

那性能优化,在程序开发中如此重要,那该如何进行性能优化呢?这里我结合开发经验,简单总结一些常用的性能优化方法。

  1. 缓存
  2. 并行执行
  3. 异步
  4. 批量
  5. 资源复用
  6. 预加载
  7. SQL优化

缓存

缓存,一种以空间换时间的思想,也是一种冗余的思想。我们将比较耗时的查询结果,缓存起来,一方面,避免每次连接数据库查询的耗时操作,另一方面,也有效使用了从缓存内存中读取的高效率。

缓存,可以分为多级缓存。一般常见的有本地缓存和分布式缓存。本地缓存框架有Caffine和Ecache等,分布式缓存框架有Redis和Memocache。对于一些无需持久化(重启后丢失)的数据,可以使用本地缓存;而需要持久化,则考虑使用分布式缓存更好。

缓存,虽然可以明显提升性能,但也存在可能数据一致性问题。需要我们根据业务场景,来选择合适的缓存策略。

并行执行

将串行执行动作,改为并行执行,也是常用的优化方法。举个通俗的例子:假如我们有四口锅,需要做饭,分别是煮鸡蛋、炒菜和煮粥;显然,串行的话,只使用一口锅,先后煮鸡蛋、炒菜和煮粥,整体时间会很长;正确的策略是,使用三口锅,三者同时进行,也即并行执行。

并行执行通常比串行效率更高,但使用过程中,需要注意是否存在线程安全问题。

实现并行的方式有很多,但总的来讲,一般都是使用多线程,这里推荐使用线程池来实现并行。

异步

有时候,我们调用一个耗时的接口(比如导出、调用第三方等)时,如果要求同步处理结果,往往会超时。

此时,可以考虑同步改为异步,先快速返回一个中间状态(比如导出中、处理中等);然后异步再进行耗时的处理,等异步处理完成,更新中间状态为已完成(并可以考虑发送完成的消息通知)。

批量

一个典型的场景是:当我们需要写入大量数据到表中,通过for循环来单次插入,是个极其耗时的操作,因为它每次都要和数据库进行链接。这也是我们编码过程中需要,特别需要去避免的;正确方式是,改用批量操作的方式,在一个数据库会话中,批量插入数据。

通俗的例子来讲,你有10个鸡蛋,需要从1楼拿到3楼教室。显然不要一次只拿一个鸡蛋,来回跑10次;而是一次将10个鸡蛋带到3楼。

资源复用

资源复用,就是复用已经获取过的资源,也是池化的思想。比如一些开源的数据库连接池,会复用此前已有的Connection,来避免重复建立,从而提升效率。

设计模式中的单例模式和享元模式,也是资源复用的思想。总的来讲,就是避免每次都新建所需的资源,考虑复用。

预加载

对于一些比较耗时的资源,且变化不频繁或者实时性要求不高的,可以考虑进行预加载。平时所说的缓存预热,就是一种预加载的思想。

我们可以在项目启动时,或者发送指定请求时,后台将后续所需的耗时资源,进行加载,放入缓存,这样后续真正需要请求时,直接取得已加载的资源,会快很多。

SQL优化

通常性能优化的瓶颈,往往在于IO操作。我们操作数据库时,由于业务需要或者设计不合理,尝尝出现慢SQL;此时就需要我们重点进行SQL优化。

SQL优化的方法有很多手段,其中几个常用的有:

  1. 设计合适的索;
  2. 避免索引失效的场景;
  3. 以小表驱动大表;
  4. 避免Select * ,只查询所需字段;
  5. 查询执行计划,针对性的进行优化;
  6. 读写分离、分库分表等;

由于SQL优化的内容较多,这里是简单点明一下,它是程序性能优化的重要方面。

总结

上述简单罗列了,一些开发中常用的性能优化方向。我们可以根据实际业务场景,针对性的采取具体的优化措施。同时,在进行性能优化时,也别忘了进行性能瓶颈的定位,只有先定位好,瓶颈在哪里,才好针对性的进行优化。

相关推荐
代码老y36 分钟前
ASP.NET Core 高并发万字攻防战:架构设计、性能优化与生产实践
后端·性能优化·asp.net
五岁小孩8 小时前
实操使用 go pprof 对生产环境进行性能分析(问题定位及代码优化)
性能优化·golang·pprof
五点六六六13 小时前
前端常见的性能指标采集
前端·性能优化·架构
软件测试-阿涛14 小时前
【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程
测试工具·jmeter·性能优化·压力测试·grafana·prometheus
海底火旺15 小时前
单页应用路由:从 Hash 到懒加载
前端·react.js·性能优化
鼠鼠我捏,要死了捏17 小时前
深入解析MongoDB分片原理与运维实践指南
mongodb·性能优化·sharding
拾光拾趣录19 小时前
内存泄漏的“隐形杀手”
前端·性能优化
鼠鼠我捏,要死了捏2 天前
基于Redisson实现高并发分布式锁性能优化实践指南
性能优化·分布式锁·redisson
笑衬人心。2 天前
后端项目中大量 SQL 执行的性能优化
sql·spring·性能优化
贵州晓智信息科技2 天前
Unity 性能优化全攻略
unity·性能优化·游戏引擎