今天群里有同學(xué)提問(wèn)“你們知道那種循環(huán)效率比較高嗎?”
姑宽,然后我想起之前在benchmark 怎么寫(xiě)看過(guò)遣耍、但還沒(méi)試過(guò)的Benchmark
,遂決定使用一下
使用Benchmark
主要有兩種方式炮车,一種是本地跑舵变,一種是使用jsPerf線上分享,具體使用方法可以看使用Benchmark.js和jsPerf分析代碼性能
我對(duì)比了下for
map
reduce
forEach
4種循環(huán)方式瘦穆,其中num
是1~1000
的數(shù)組纪隙,empty
是1000個(gè)undefined
數(shù)組,結(jié)果如下圖:
發(fā)現(xiàn)for
跑undefined
數(shù)組比有數(shù)字的數(shù)組慢好多扛或,而map
跑有數(shù)字的比undefined
的快
我還在本地測(cè)試了一下var
與let
在for
循環(huán)中是否有差異
const Benchmark = require('benchmark')
const suite = new Benchmark.Suite;
const arr = [0,1,2,3,4,5,6,7,8,9]
// add tests
suite.add('let', function() {
for(let i = 0, len = arr.length; i < len; i++) {
arr[i]
}
})
.add('var', function() {
for(var i = 0, len = arr.length; i < len; i++) {
arr[i]
}
})
// add listeners
.on('cycle', function(event) {
console.log(String(event.target));
})
.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').map('name'));
})
.run()
結(jié)果如下绵咱,發(fā)現(xiàn)let
比var
慢很多
let x 24,180,382 ops/sec ±0.85% (88 runs sampled)
var x 49,310,969 ops/sec ±0.96% (90 runs sampled)
Fastest is var
這些不測(cè)一測(cè)是不會(huì)知道有這么明顯的差異的,接下來(lái)就是分析為什么了告喊,這我就先不寫(xiě)了麸拄,最近在看了《You-Dont-Know-JS》系列的時(shí)候找到了答案(這個(gè)開(kāi)源書(shū)真不錯(cuò),會(huì)從編譯器角度來(lái)講解JS的一些行為黔姜,真應(yīng)該早點(diǎn)看看)
用于
for
循環(huán)頭部的let
聲明被定義了一種特殊行為拢切。這種行為說(shuō),這個(gè)變量將不是只為循環(huán)聲明一次秆吵,而是為每次迭代聲明一次淮椰。并且,它將在每次后續(xù)的迭代中被上一次迭代末尾的值初始化纳寂。 —— 你不懂JS:作用域與閉包 第五章:作用域閉包
有興趣的朋友還可以到這http://jsperf.com/browse看看主穗,里面有250個(gè)最新的網(wǎng)友們的測(cè)試,昨天我隨意點(diǎn)進(jìn)去兩個(gè)看了下毙芜,其中之一在測(cè)試有console.log
跟沒(méi)有之間的差別忽媒,還有一個(gè)測(cè)試了各種DOM
選擇方式的差異
還有很多更好的用法,可以參考這些github項(xiàng)目fast-js腋粥、fast.js
我也是剛接觸這個(gè)晦雨,有啥更好的認(rèn)知了回頭再補(bǔ)充
其它參考
- 你不懂JS: 異步與性能 第六章: 基準(zhǔn)分析與調(diào)優(yōu) 這篇寫(xiě)的非常詳細(xì),有興趣深入研究的可以好好看一下
- Bulletproof JavaScript benchmarks