代码大全-代码调优技术-读书笔记
最近几几天在做一些代码重构和整理的工作,重构同时需要整理,优化代码,没事的时候翻一下之前的技术书,重点看了一下代码调优部分,个人感觉有收获的部分在这里记录分享
低级语言重构代码
有很多中方式可以优化代码结构,低级语言重构代码应该是性能提升比较明显的,比如,用c重构php代码, 汇编重构c代码等,都是性能提升比较明显的, 工作中使用这种方式来处理优化过程,需要谨慎,毕竟技术栈适配等问题需要协调和思考 在一般常规办法优化代码提升有限的情况下,低级语言重构代码是一个好的优化思路
在搜索中使用哨兵值
例如现在需要从10000个对象中扫描序号为5000的元素,如果没有哨兵值,程序会顺序扫描10000条数据,然后把id为5000的数据返回 顺序查找的场景如果传入哨兵值,当程序在id=5001时则直接return,减少了后面5000个元素的扫描,总体减少了程序的性能开销 同样的思路在Mysql 查询数据时使用limit 1条件有异曲同工的效果 实际开发中Mysql limit 1 常用,但for循环中使用哨兵值加快性能实际使用比较少
预计算结果
1.动态计算结果,2.计算一次并保存结果,在需要时查找,使用 实际开发中很多场景都可以使用预计算结果然后缓存起来,一次计算多次使用,性能提升是非常有效的 例如,新闻文章,一个站点可能有2000W条新闻,每次查询时需要count总数然后计算分页,如果正常开发,需要在页面中每次api请求都去count2000W条新闻数据,一天10000次接口访问就需要进行10000次查询 10000*2000W 条数据count操作, 如果提前将2000W的总数统计出来,然后存入数据库或者缓存中一小时更新更新一次,一天则只需要count24次
降低计算强度
将耗费性能较多的操作替换为耗费性能较低的操作,并且有些可以提前计算的值可直接引用, 如3600*24,可以直接替换为86400; 如 int x = 16; int result = x >> 1; // result = 8, 相当于 x / 2
数据变换
- 使用整数而不是浮点数,根据场景,如果能使用单精度浮点数则尽量避免使用双精度浮点数
- 减少数组维度
最小化循环内部的工作
如果循环内有大量取值操作,或者统计操作可以将公共部分提取到循环外计算好然后在循环中使用 优化循环内操作是经常忽略,但是实际优化效果非常好的小技巧
问题
- 这里我想到一个问题,实际开发中,你习惯使用多维数组组合还是对象链式调用组合做数据结构开发 答:如果是快速完成功能,注重性能,不考虑扩展和优化,推荐使用多维数组 如果是需要大量维护和调整,优化的程序,可以使用对象链式调用的语义表达和后期拓展性能更好