异步操作可以方便地支持横向扩容 , 也可以缓解瞬时压力 , 使请求变得平滑 。 同步请求 , 就像拳头打在钢板上;异步请求 , 就像拳头打在海绵上 。 你可以想象一下这个过程 , 后者肯定是富有弹性的 , 体验更加友好 。
惰性加载
最后一种 , 就是使用一些常见的设计模式来优化业务 , 提高体验 , 比如单例模式、代理模式等 。 举个例子 , 在绘制 Swing 窗口的时候 , 如果要显示比较多的图片 , 就可以先加载一个占位符 , 然后通过后台线程慢慢加载所需要的资源 , 这就可以避免窗口的僵死 。
04
结果集优化
接下来介绍一下对结果集的优化 。 举个比较直观的例子 , 我们都知道 XML 的表现形式是非常好的 , 那为什么还有 JSON 呢?除了书写要简单一些 , 一个重要的原因就是它的体积变小了 , 传输效率和解析效率变高了 , 像 Google 的 Protobuf , 体积就更小了一些 。 虽然可读性降低 , 但在一些高并发场景下(如 RPC) , 能够显著提高效率 , 这是典型的对结果集的优化 。
这是由于我们目前的 Web 服务 , 都是 C/S 模式 。 数据从服务器传输到客户端 , 需要分发多份 , 这个数据量是急剧膨胀的 , 每减少一小部分存储 , 都会有比较大的传输性能和成本提升 。
像 Nginx , 一般都会开启 GZIP 压缩 , 使得传输的内容保持紧凑 。 客户端只需要一小部分计算能力 , 就可以方便解压 。 由于这个操作是分散的 , 所以性能损失是固定的 。
了解了这个道理 , 我们就能看到对于结果集优化的一般思路 , 你要尽量保持返回数据的精简 。 一些客户端不需要的字段 , 那就在代码中 , 或者直接在 SQL 查询中 , 就把它去掉 。
对于一些对时效性要求不高 , 但对处理能力有高要求的业务 。 我们要吸取缓冲区的经验 , 尽量减少网络连接的交互 , 采用批量处理的方式 , 增加处理速度 。
结果集合很可能会有二次使用 , 你可能会把它加入缓存中 , 但依然在速度上有所欠缺 。 这个时候 , 就需要对数据集合进行处理优化 , 采用索引或者 Bitmap 位图等方式 , 加快数据访问速度 。
05
资源冲突优化
我们在平常的开发中 , 会涉及很多共享资源 。 这些共享资源 , 有的是单机的 , 比如一个 HashMap;有的是外部存储 , 比如一个数据库行;有的是单个资源 , 比如 Redis 某个 key 的Setnx;有的是多个资源的协调 , 比如事务、分布式事务等 。
现实中的性能问题 , 和锁相关的问题是非常多的 。 大多数我们会想到数据库的行锁、表锁、Java 中的各种锁等 。 在更底层 , 比如 CPU 命令级别的锁、JVM 指令级别的锁、操作系统内部锁等 , 可以说无处不在 。
只有并发 , 才能产生资源冲突 。 也就是在同一时刻 , 只能有一个处理请求能够获取到共享资源 。 解决资源冲突的方式 , 就是加锁 。 再比如事务 , 在本质上也是一种锁 。
按照锁级别 , 锁可分为乐观锁和悲观锁 , 乐观锁在效率上肯定是更高一些;按照锁类型 , 锁又分为公平锁和非公平锁 , 在对任务的调度上 , 有一些细微的差别 。
对资源的争用 , 会造成严重的性能问题 , 所以会有一些针对无锁队列之类的研究 , 对性能的提升也是巨大的 。
06
算法优化
算法能够显著提高复杂业务的性能 , 但在实际的业务中 , 往往都是变种 。 由于存储越来越便宜 , 在一些 CPU 非常紧张的业务中 , 往往采用空间换取时间的方式 , 来加快处理速度 。
算法属于代码调优 , 代码调优涉及很多编码技巧 , 需要使用者对所使用语言的 API 也非常熟悉 。 有时候 , 对算法、数据结构的灵活使用 , 也是代码优化的一个重要内容 。 比如 , 常用的降低时间复杂度的方式 , 就有递归、二分、排序、动态规划等 。
一个优秀的实现 , 比一个拙劣的实现 , 对系统的影响是非常大的 。 比如 , 作为 List 的实现 , LinkedList 和 ArrayList 在随机访问的性能上 , 差了好几个数量级;又比如 , CopyOnWriteList 采用写时复制的方式 , 可以显著降低读多写少场景下的锁冲突 。 而什么时候使用同步 , 什么时候是线程安全的 , 也对我们的编码能力有较高的要求 。
这部分的知识 , 就需要我们在平常的工作中注意积累 , 后面的课时中 , 也会挑比较重要的知识点穿插讲解 。
高效实现
在平时的编程中 , 尽量使用一些设计理念良好、性能优越的组件 。 比如 , 有了 Netty , 就不用再选择比较老的 Mina 组件 。 而在设计系统时 , 从性能因素考虑 , 就不要选 SOAP 这样比较耗时的协议 。 再比如 , 一个好的语法分析器(比如使用 JavaCC) , 其效率会比正则表达式高很多 。
- CPU|四款旗舰手机性能表现抢眼,充分释放手机性能潜力,你喜欢哪款?
- 三星Galaxy|别骂了,三星Galaxy S22推送新系统,取消限制游戏性能!
- 蓝牙耳机|游戏性能超强?OPPO Find X5 Pro天玑版实际上手,游戏党的首选
- 天玑9000|2K屏+天玑9000处理器!性能、功耗拉满!K50宇宙新成员加入群聊
- 显卡|兄弟们,JS急了,现在都急着喷40系显卡性能过剩,不如30系显卡了
- 中国移动|中国移动已一骑绝尘、中国电信紧跟其后:“提速提质”新方向确定
- 英伟达|老机iQOO Z1测评:领先的不止是性能
- 华为|手机CPU越往上的,CPU性能越好,处理速度越快
- CPU|i712650h和i712700h性能差距大吗?参数配置哪个好?详细解读
- 黄仁勋|OPPO中端机降价,性能跟快充是亮点,市场表现确实很值得入手