一文了解性能优化的方法

背景

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

性能优化方法总览

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

  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优化的内容较多,这里是简单点明一下,它是程序性能优化的重要方面。

总结

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

相关推荐
别说我什么都不会15 分钟前
鸿蒙(HarmonyOS)性能优化实战-应用性能分析工具CPU Profiler使用指南
性能优化·harmonyos
Light602 小时前
CSnakes vs Python.NET:跨语言集成的巅峰对决与架构解密
python·性能优化·.net·跨语言集成·双向互操作
漫步云端的码农4 小时前
Three.js场景渲染优化
前端·性能优化·three.js
A仔不会笑5 小时前
MySQL面试篇——性能优化
java·数据库·mysql·面试·性能优化
冲鸭ONE8 小时前
for循环优化方式有哪些?
后端·性能优化
蓝天下小溪旁戴着耳机去放羊1 天前
详解数据传输——零拷贝、direct IO
性能优化·操作系统
砖厂小工1 天前
Compose Performance Review
性能优化·android jetpack
Python数据分析与机器学习1 天前
《基于锂离子电池放电时间常数的自动化电量评估系统设计》k开题报告
运维·性能优化·自动化·软件工程·软件构建·个人开发
weixin_748877002 天前
【2025年后端开发终极指南:云原生、AI融合与性能优化实战】
人工智能·云原生·性能优化
NoneCoder2 天前
工程化与框架系列(22)--前端性能优化(中)
前端·性能优化·状态模式