性能优化业务实践

61 阅读3分钟

性能优化.svg

js

  1. 对象属性和数组元素的速度都比变量慢
  2. 也就是对于重复对象访问路径,要进行变量提炼


// 低性能版本

console.log(foo.bar.tap.count);

console.log(foo.bar.tap.count + 1);

  
// 高性能版本

const count = foo.bar.tap.count;

console.log(count);

console.log(count + 1);

这里的底层逻辑,是将嵌套属性单独提取为局部变量,下次取值时不再需要通过这条链路索引取值,提升性能

易错点:

  1. 数组的api slice 是不包含末尾序列的。
  2. Math.min() 默认值返回infinity
  3. 隐士转换 Number(null) / 100 Number仅仅对于null返回0,其余为NAN

数据缓存

  1. 常用localsotrage ,项目里面用到了lru-cahce 因为,业务特殊性,调用接口次数受限,同样的请求,没有必要重复去做,
  const cache = new LRUCache({
    max: 500,
    maxAge: 1000 * 60 * 60,
  });

  cache.set("key", "test");
  const tests = cache.get("key"); // "value"
  console.log("tests", tests);

webworker

  1. 项目当时,有存在全屏大量实时数据订阅,并进行大量业务逻辑计算的逻辑,由于本身js是单线程,所以对于较多的实时计算,逻辑本身存在问题。

框架层面

  1. react.lazy按需加载
  2. 避免深层次的props传递,因为会引发不必要的子组件渲染,所以这时用readux处理
  3. 灵活运用useMemo ,useCallback,lru-cache 等缓存数据。

网络层面

  1. 接口请求并发借助 promise.all,避免某个请求过慢阻塞了后续请求。
  2. 条件允许,使用http2因为存在多路复用,http1.0版本存在队头阻塞问题,并且浏览器并发限制,单次最多6个数据并发
  3. 接口请求顺序优化:实际业务中存在很多,耗时多,但是又重要的公共请求,就可以提前到最开始进行加载,避免整体耗时。

缓存层面

  1. 配合服务端配置,cache-control字段,实现浏览器缓存
  2. lru-cache
  3. CDN配置,把一些常用的静态资源存放到cdn服务器,实现资源加载速度的提升

项目层面

  1. 无限走势图,滚动,借助无限懒加载思路,添加了上下缓冲区实现。
  2. 静态锁-防止异步接口,并发执行。具体例子待补充

库-echarts

  1. echarts 存在合并配置 notmerge属性,这个属性对于需要删除某些数据,存在缓存复用的问题
  2. 可通过关闭动画,针对,实时更新场景,以及较多数量图线
  3. 采取larger模式,在series 里面进行配置
  4. 采取svg模式渲染,针对需高清图,以及较大规模数据集进行渲染。

数据状态

  1. 对于前端业务开发中,其实很多时候就是在和数据流在打交道,并且react 数据驱动视图。所以出现bug后,首先思考这个异常状态是有哪一步设置的,继续不断层层向上排除。
  2. 配合mvvm设计思路,将数据层,格式化数据(业务数据处理),等相分离。

react

  1. 依赖变化底层依赖于Object.is。
  2. less变量作用域,定义的变量仅仅在当前的作用域内起作用,导出无效