性能优化方法论系列目录
《一、性能优化的本质》
《二、性能优化方法论的思想源泉》
《三、性能优化的核心思想(1)》
《三、性能优化的核心思想(2)》
《三、性能优化的核心思想(3)》
《四、性能优化的注意事项》
《五、实际案例分析》
《六、总结》

3.4 其他

3.4.1 随机读写转顺序读写

随机 IO 读写速度和顺序 IO 读写速度差距较大。

因此有可能的话,尽量将随机读写转为顺序读写。

3.4.2 就近原则

前面讲到使用缓存达到空间换时间的效果。

但有时候还可以采用 “就近原则” ,使用“更近”的数据,调用“更近”的服务。

一般来说,同一个虚拟机 > 同一台服务器 > 同一个集群 > 同一个机房 > 同一个城市 > 同国其他城市 > 跨国。

Dubbo 从 2.2.0 开始,每个服务默认都会在本地暴露。在引用服务的时候,默认优先引用本地服务。如果希望引用远程服务可以使用一下配置强制引用远程服务[8]。 本质上也是采用 “就近原则”,优先调用本地服务,从而减少不必要的网络 时。

3.4.3 选择合适的数据结构和算法

不同数据结构有各自的优势和劣势,有各自的适用场景。

如去重,尤其是数据量较大时,可以利用 Set 的元素唯一性的特性,快速对一个集合进行去重操作,避免使用 Listcontains 方法进行遍历、对比、去重。

有些场景下可以使用 BitSet 、Bag 等数据结构性能会更好。

再比如 HashMap 在哈希冲突时先拉链,冲突超过 8 个转为红黑树。当冲突较严重时,红黑树的性能显然比链表更高,这其实就是根据情况结合不同的数据结构的优势实现性能优化的典型案例。

大家都知道不同算法的时间复杂度不同,不同算法的耗时有巨大的差异,在实际开发中涉及到算法部分一定要注意时间复杂度问题。

在工作中就遇到过有人用 List 去重,当数据量较大时,很容易超时。

有些场景下可以选择使用布隆过滤器等算法优化性能。

3.4.4 加限制条件(技术层面)

此外,添加一些限制条件也是性能优化的重要思想。

以 Redis 的动态字符串为例。

其内部实现思想和 Java 中的 ArrayList 非常相似,采用预先分配冗余空间的方式来减少内存的频繁分配。

不同的是,当字符串小于 1 M 时,扩容一倍;如果超过 1M ,每次扩容 1M 的空间,最大长度为 512 M。

这里的最大长度限制就是为了保证不因单个 key 不至于过大,导致慢查询。

3.4.5 CPU 密集型和 IO 密集型

对于 CPU 密集型任务,可以通过增加机器和提高机器配置,使用大数据框架,升级架构等方式来解决。

对于 IO 密集型操作,可以侧重考虑通过并行、异步、合并、预处理等方法进行性能优化。

3.4.6 根据技术特点去优化

具体到某个技术都有会辅助性能优化的命令或工具,需要大家自己去掌握。

不同的工具性能优化也有自己的特点,如 MySQL 设计好索引、HBase 设计好 rowkey 规则等,需要针对性地学习。

如 MySQL 可以使用 explain 指令分析语句性能进行分析。

如 HBase rowkey 的设计可以参考阿里云数据库 HBase 开发指南中的一些建议。

还有很多技术需要通过调整参数来优化,这些也需要通过官方文档、相关的权威图书、相关的技术专栏等针对性优化。

3.4.7 全链路优化

很多时候性能优化不能只把眼光局限于当前系统,需要考虑全链路,考虑前端和后端,当前系统和下游系统等。

有些性能优化问题,需要前端和后端通力合作,一起改进。

比如前端在某个页面执行了一些没有必要的调用;前端加载的资源速度过慢,可以考虑合并资源或者使用 CDN 加速等。

有些性能优化问题,需要后端和其下游通力合作,一起改进。

如果下游只提供某个功能的单个接口,而我们有批量执行的诉求,可能需要推动下游提供批量接口。

如果下游接口有性能问题,可能还需要推动下游进行优化。

3.4.8 多种手段相结合

不同的数据结构和算法、不同中间件、不同的框架和架构,都有最适合的使用场景,都有各自的优势和劣势。在实践中,往往需要多种性能优化思想结合在一起来解决问题。

如某个业务将 MySQL 、 Redis 和 Es 多种存储方式结合一起使用,发挥各自的优势;如从技术层面和产品层面相结合进行优化。

在实际进行性能优化时要结合具体的场景,进行权衡之后做出选择。

比如有些数据可以存到 MySQL 表中,有些热点数据或大文本可以存到缓存中,需要进行模糊搜索的条件可以放到搜索引擎中。

比如在设计某个功能时,需要多表联查,此时可以通过在一个表中冗余另外一个表的字段来避免联查操作;还可以通过 ES 等技术做一个大宽表来避免 DB 层多表联查,来提高性能。

比如将单库改成读写分离架构,或者改成分库分表架构,将单体应用拆分成多个微服务等。

3.5 产品层面

不是所有的性能优化都是要通过技术手段来实现,如果技术手段不容易解决,可以考虑从产品设计层面来实现。

3.5.1 加限制条件

如果从技术层面性能优化不好做,可以和产品协商,让产品做出一些妥协,加上一些限制条件,很多问题就迎刃而解

比如产品层面可以限制用户上传的图片、文件大小,限制录入的文本大小等。

比如提供不同的版本,默认选择性能较好的版本。如视频网站提供不同的清晰度,默认展示普通清晰度的视频或者根据用户网速选择最优的清晰度。

还可以和产品同学进行交流,砍掉某些不合理的搜索条件等来获得更好的性能体验。

如微信发送图片时,即使发送时你选择原图,对方接收到的一般都是预览图,只有打开后选择“下载原图”,才会真正去下载原图到本地。

此外,微信对视频或其他类型的文件传输也有大小的限制。

这些都是通过加限制条件来辅助性能优化在产品层面的体现。

3.5.2 砍需求

优秀的开发也要有一些产品思维,要懂得权衡某些设计的利弊,权衡投入产出比等。

可能下面这句话不是很“正能量”,但的确是解决问题的一个思路,哈哈。

当有些产品提出一些不太合理的奇葩需求,而且这种需求容易投入产出比不高,从技术层面不好解决而且对用户的价值并不是很大时,可以考虑说服产品砍掉需求。


创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。

【性能优化方法论系列】三、性能优化的核心思想(3)相关推荐

  1. 【性能优化方法论系列】三、性能优化的核心思想(1)

    性能优化方法论系列目录 <一.性能优化的本质> <二.性能优化方法论的思想源泉> <三.性能优化的核心思想(1)> <三.性能优化的核心思想(2)> & ...

  2. WIN7封装教程2018系列(三)—手动优化与清理

    在保证系统稳定,长效的前提下对系统进行适当的优化清理是有必要的.其实大部分优化清理都可以通过优化工具软件来完成操作,不过工具也不是万能的,不能保证优化和清理百分之百的内容,至少目前没有这样的工具,所以 ...

  3. mysql varchar 非空判断_工资从1万到3万,你还差mysql数据库优化之系列三

    查询性能的优化 优化查询分析的步骤: 1.应用查询是否检索超过需要的数据 2.mysql服务器是否在分析超过需要的数据 正确使用索引: 1.like语句操作 一般不使用%或_开头例如: select ...

  4. Unity3D优化技巧系列三

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  5. mysql分页案例_MySQL优化案例系列-mysql分页优化

    通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询.例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY ...

  6. 启动优化·基础论·浅析 Android 启动优化

    " [小木箱成长营]启动优化系列文章(排期中): 启动优化 · 工具论 · 启动优化常见的六种工具 启动优化 · 方法论 · 这样做启动优化时长降低 70% 启动优化 · 实战论 · 手把手 ...

  7. 查看linux内存优化,Linux性能优化和监控系列(三) 分析Memory使用状况

    Linux性能优化和监控系列(三) 分析Mem 分析Memory使用状况 内存是影响服务器性能的一个主要因素, 当进程已经驻留内存或者系能够分配给进程足够的内存给它, CPU能顺利自如的运行. 如果发 ...

  8. 这可能是最好的性能优化教程(三)

    这可能是最好的性能优化教程系列专栏 这可能是最好的性能优化教程(一) 这可能是最好的性能优化教程(二) 这可能是最好的性能优化教程(三) 前言 内存泄漏从来都是我们老生常谈的话题,无论是 Androi ...

  9. Android性能优化方法论

    作为一名开发,性能优化是永远绕不过去的话题,在日常的开发中,我们可肯定都会接触过.Android 的性能优化其实是非常成熟的了,成熟的套路,成熟的方法论,成熟的开源框架等等. 对于接触性能优化经验较少 ...

最新文章

  1. [Spring 深度解析]第5章 Spring之DAO
  2. Linux创建jupyter notebook和jupyter lab, windows可远程访问
  3. 小波变换如何去噪的思想
  4. OBS显示器捕获黑屏的解决方法
  5. Unity3D - UGUI的手动搭建
  6. FZU - 2042 The Mad Mathematician 数位dp + 算贡献
  7. 缺失值处理 - 获取一段时间内所有日期的列表 - (Python、MySQL)
  8. MinGW 使用 msvcr90.dll
  9. jrebel 远程部署 配置记录
  10. ceph auth get boostrap-osd_那些某橙色软件都能GET到手的有文凭粗粮 速速前来种草
  11. python下载-【Python下载 官方版】Python 3.8.0-ZOL软件下载
  12. FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
  13. seata xid是什么_Spring Cloud Alibaba分布式事务解决框架Seata概念入门篇
  14. 秒杀系统设计要点总结
  15. 静态库与动态库的区别与优缺点
  16. Fortran 中的common,include和module
  17. jquery html5关系图,html5 canvas复杂人物关系图设置代码
  18. 超市进销存管理系统(SSM,MYSQL,VUE,JSP)
  19. 如何通过Java导出带格式的 Excel 数据到 Word 表格
  20. ECharts之世界地图

热门文章

  1. C#进阶系列——MEF实现设计上的“松耦合”(一)
  2. 完全背包问题【zzh制作】
  3. [蓝桥杯]分分钟的碎碎念(动态规划)
  4. 蒙特卡洛树是什么算法?
  5. 【python中break、continue 、pass终止循环的区别】
  6. IDEA - 常用快捷键
  7. 计算机网络路由器关闭电源,关闭了无线功能怎么办?
  8. 【原创】基于Tensorflow2.×识别COVID-19胸部X射线
  9. char* wchat_t*互转 及 A2T, T2A宏及其实现原理
  10. py2neo 创建关系_py2neo在已有节点上批量创建关系