今天群里有同学提问“你们知道那种循环效率比较高吗?”
,然后我想起之前在benchmark 怎么写看过、但还没试过的Benchmark
,遂决定使用一下
使用Benchmark
主要有两种方式,一种是本地跑,一种是使用jsPerf线上分享,具体使用方法可以看使用Benchmark.js和jsPerf分析代码性能
我对比了下for
map
reduce
forEach
4种循环方式,其中num
是1~1000
的数组,empty
是1000个undefined
数组,结果如下图:
发现for
跑undefined
数组比有数字的数组慢好多,而map
跑有数字的比undefined
的快
我还在本地测试了一下var
与let
在for
循环中是否有差异
|
|
结果如下,发现let
比var
慢很多
|
|
这些不测一测是不会知道有这么明显的差异的,接下来就是分析为什么了,这我就先不写了,最近在看了《You-Dont-Know-JS》系列的时候找到了答案(这个开源书真不错,会从编译器角度来讲解JS的一些行为,真应该早点看看)
用于for循环头部的let声明被定义了一种特殊行为。这种行为说,这个变量将不是只为循环声明一次,而是为每次迭代声明一次。并且,它将在每次后续的迭代中被上一次迭代末尾的值初始化。 —— 你不懂JS:作用域与闭包-第五章:作用域闭包
有兴趣的朋友还可以到这http://jsperf.com/browse看看,里面有250个最新的网友们的测试,昨天我随意点进去两个看了下,其中之一在测试有console.log
跟没有之间的差别,还有一个测试了各种DOM
选择方式的差异
还有很多更好的用法,可以参考这些github项目fast-js、fast.js
我也是刚接触这个,有啥更好的认知了回头再补充
其它参考
- 你不懂JS: 异步与性能 第六章: 基准分析与调优 这篇写的非常详细,有兴趣深入研究的可以好好看一下
- Bulletproof JavaScript benchmarks