一文了解性能优化的方法

背景

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

性能优化方法总览

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

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

总结

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

相关推荐
二进制的Liao3 小时前
【数据分析】什么是鲁棒性?
运维·论文阅读·算法·数学建模·性能优化·线性回归·负载均衡
海尔辛12 小时前
Unity UI 性能优化--Sprite 篇
ui·unity·性能优化
凌佚15 小时前
rknn优化教程(一)
c++·目标检测·性能优化
橘子青衫15 小时前
Java并发编程利器:CyclicBarrier与CountDownLatch解析
java·后端·性能优化
聪颖不聪颖1 天前
使用 Time Profiler 查看关键函数调用耗时情况,从而分析和解决问题
性能优化
DemonAvenger1 天前
Go并发编程:内存同步与竞态处理
性能优化·架构·go
橘子青衫2 天前
Java多线程编程:深入探索线程同步与互斥的实战策略
java·后端·性能优化
低调的JVM2 天前
Async-profiler 内存采样机制解析:从原理到实现
java·c++·性能优化
全栈技术负责人2 天前
H5移动端性能优化策略(渲染优化+弱网优化+WebView优化)
性能优化
星辰离彬2 天前
Java Stream 高级实战:并行流、自定义收集器与性能优化
java·开发语言·后端·性能优化