javascript性能优化四 之堆栈中js执行过程等

JSBench的使用
jsperf已经停止维护了,介绍一个新的www.jsbench.me性能测试网站
在这里插入图片描述
堆栈中的JS执行过程
在这里插入图片描述
通过画图的方式走一遍上面代码块的流程
当浏览器真正要执行代码的时候肯定有一个执行上下文的环境的ECStack,用于存放执行上下文。
在这里插入图片描述
Js代码在开始执行之后首先会在堆内存里创建一个执行环境栈,然后用他来存放着不同的执行上下文,代码从上往下执行最先创建的是应该是EC(G全局执行上下文),在下面把代码都执行了申明和存放,基本数据类型是存放在栈内存里的,而对于引用类型来说是存放在堆区里面的。一般是GC来回收处理的,而栈内存里的出栈是主线程管理的。每当遇到函数声明的时候会重新生成一个执行上下文进栈,代码执行完成后由是否产生了闭包来决定当前引用的堆是否要被释放掉
减少判断层级
在这里插入图片描述
判断逻辑简化,把无效的条件提前return掉,这样的话就不会有这么多的嵌套
在这里插入图片描述
在jsbench里测试一下两个执行的速度
在这里插入图片描述
ops值越大速度越快

减少作用域链查找层级
在这里插入图片描述
优化只需要在name前加上var,变成局部的,让作用域查找的时候,减少向上查找的操作
在这里插入图片描述
在这里插入图片描述
这么小的改动对性能的变化还是挺大的
这是建 立在关注速度的情况下来说,下面的写法快一点,但是对内存来说第一种写法是好一点的。第二种会重新开辟一个空间来存放name的。如果name非常大的话,会发现第一种写法更节省空间一些,如果没有闭包的引用,GC也会回收,这个空间的占用也是暂时的。所以得看情况用哪一种

减少数据读取次数
在js中我们经常用到的数据表现形式主要 分为字面量,局部的变量以及数组元素和对象属性这四种。
访问字面量和局部的变量速度是最快的,因为是直接存放在栈区中的,而访问数组元素和对象成员稍慢一些,这是因为要按照引用的关系先要找到在堆内存的位置,例如对象属性的访问在操作的时候还要考虑到原型链上的查找。
在这里插入图片描述
改造后
在这里插入图片描述
在这里插入图片描述
差异还是比较明显的,所以把频繁使用的值进行一次缓存

字面量与构造式
不同的数据声明方式和性能的关系,因为在很多时候让编码的时候采用数据量的方式代替构造的方式去声明,对这两种进行个测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用来构造函数类型的比字面量要慢一点,再来对比一下字符串
在这里插入图片描述
在这里插入图片描述
这差异也太大了,上一个是引用类型的时候差距还没这么大,针对这种基本数据类型的值千万不要用构造式去定义

减少循环体中活动
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再来和while对比 呢
在这里插入图片描述
在这里插入图片描述
While的速度更快,for从前向后找,while是从后向前找的,当小于0的时候结束,从后向前可以少做很多判断

减少声明及语句数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在代码执行之前肯定要有个编译的过程,虽然js是一门解释型的语言,但真正运行之前肯定还会有一个编译的过程的,向上面代码量多一些,而且在做词法分析的时候遇到这些关键字的时候会根据一些规则进行拆分,要拆出w,空格,=号之类的都要拎出来变成词法单元,还要做语法分析,最终变成语法树,有了抽象的语法树之后转成代码,然后再执行。所以这个过程的时间消耗浪费在这里了。而下面的方法只要对ele做个词法分析就ok了
个人觉得不大量使用的时候,要减少声明。。。。

惰性函数与性能
在这里插入图片描述
改造后
在这里插入图片描述
在这里插入图片描述
第一种反而快一点,而且快好多,。第二次我们采用了惰性函数,认为是一种比较高级的语法对代码进行了优化,优化的是对判断次数的减少,下一次进来就不需要再对addEvent进行赋值了,结果反而是没做优化的快一些
在这里插入图片描述
所以得看优化做的啥,如果多调用几次,应该就能看出来优化的效果
在这里插入图片描述
尴尬了还是很慢,速度慢但是也不是否认惰性函数的思想不好,只是说基于这个场景不适用

采用事件绑定
在这里插入图片描述
改造后
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值