性能优化方法论系列目录
《一、性能优化的本质》
《二、性能优化方法论的思想源泉》
《三、性能优化的核心思想(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. 施一公:大学必须不计成败、不论得失地为探索者提供宽容和支持的环境
  2. 【 C 】作用域、链接属性、存储类型、static 关键字简介及总结
  3. 【bzoj2463】 谁能赢呢?
  4. Vue中使用moment将时间戳数据格式化显示(el-table中)
  5. 局部钩子能防全局钩子吗_Django局部钩子和全局钩子
  6. linux 获取本机的所有IP地址
  7. 文字过多以省略号代替,放在文字上会显示title信息提示
  8. docker数据圈_《Docker从入门到跑路》之镜像和容器的基本操作
  9. HTTP传输二进制初探
  10. [Flex] flex的安全沙箱,你保障了安全的同时也害苦了多少我这样的人那
  11. Web前端/辅助工具
  12. 《湮灭》脑洞:行星级癌变与人的自我救赎
  13. Terrasolid安装与破解
  14. 如何给电脑做磁盘分区
  15. 华为asph是什么型号_华为手机各系列有什么区别 华为手机各系列介绍
  16. 2021阿里云开发者大会——时隔两年平头哥有哪些杰作?
  17. 霍夫曼编码代码matlab,matlab 实现霍夫曼编码
  18. JAVA的Map怎么判断为空_检查Java中的HashMap是否为空
  19. oa办公系统都有哪家?
  20. html+css实现轮播图

热门文章

  1. Unity汽车漂移轮胎印胎痕效果实现
  2. 【数据产品案例】有赞美业数据报表
  3. 英特尔与波士顿咨询公司联合向企业客户推售 AI
  4. LCR数字电桥测量兆欧级高阻值抗电阻的原因分析
  5. 倒计时js代码精确到时分秒
  6. 基于几何学习图像的三维重建发展_基于深度学习的三维重建算法:MVSNet、RMVSNet、PointMVSNet、Cascade系列...
  7. H5移动端痛点问题(不定期更新)
  8. 评选 | 2017中国AI英雄风云榜票选即将开启,12月4日在乌镇公布榜单
  9. [Python3网络爬虫开发实战] 付费讯代理、阿布云代理的使用
  10. java设置httponly,java设置httponly