新聞中心
看過我對(duì)JavaScript 性能優(yōu)化相關(guān)的討論的同學(xué)們一定很了解我的一個(gè)癖好,就是將一大段的script分解成多個(gè)塊來執(zhí)行。通過使用setTimeout(),你可以去改變特定代碼執(zhí)行的時(shí)間,從而做到讓UI現(xiàn)場(chǎng)執(zhí)行已經(jīng)在隊(duì)列里的任務(wù)。比如,你可以通過這樣的方式把要執(zhí)行的代碼在50ms后加到UI線程隊(duì)列里:

- setTimeout(function(){
- //do something
- }, 50)
那么,在50ms后,這個(gè)函數(shù)就會(huì)被添加到隊(duì)列里,并在輪到它的時(shí)候執(zhí)行。調(diào)用setTimeout()方法可以允許當(dāng)前的JavaScript任務(wù)完成從而下一個(gè)UI更新可以順利進(jìn)行。
雖然我一直很支持使用setTimeout()來提高性能,但是還是存在幾個(gè)問題。***個(gè)并且是最重要的問題是不同的瀏覽器有著不一樣的時(shí)間精確度。IE8和更早的IE的時(shí)間精確度是15.6ms,而IE9,或者更新的瀏覽器,還有chrome的時(shí)間精確度已經(jīng)到達(dá)4ms。所有的瀏覽器都強(qiáng)制給setTimeout設(shè)置了一個(gè)***延遲值,所以setTimeout(fn, 0)實(shí)際上在大于0ms的時(shí)間之后才會(huì)執(zhí)行,具體取決于對(duì)應(yīng)的時(shí)間精確度。
另一個(gè)是電源使用的問題。管理時(shí)間關(guān)系到筆記本或者手機(jī)的電池使用。Chrome曾經(jīng)嘗試把時(shí)間精確度降低到1ms,結(jié)果發(fā)現(xiàn)會(huì)增加筆記本電池的損耗。***還是覺得把時(shí)間精確度設(shè)置回4ms。其他瀏覽器也做過類似的嘗試,不過許多油門計(jì)時(shí)器分辨率為1s。微軟發(fā)現(xiàn)時(shí)間精確度為1ms的時(shí)候,電池的使用時(shí)間會(huì)降低25%。實(shí)際上,IE9會(huì)判斷筆記本是否在使用電池的情況下運(yùn)行,如果是電池,則時(shí)間精確度為15.6ms,如果是直接插的電源則時(shí)間精確度會(huì)降低到4ms。
來自W3C Web Performance Working Group的一個(gè)方案“ Efficient Script Yielding ”,定義了一個(gè)新的函數(shù)去實(shí)現(xiàn)腳本的分塊執(zhí)行的setImmediate()方法。 這個(gè)方法接收一個(gè)函數(shù)作為參數(shù),它可以讓這個(gè)函數(shù)在UI線程空閑的時(shí)候執(zhí)行?;镜挠梅ǎ?/p>
- var id = setImmediate(function(){
- //do something
- });
setImmediate()函數(shù)會(huì)返回一個(gè)id,這個(gè)id可以通過clearImmediate()方法來取消這個(gè)過程。
我們也可以給它傳遞一些參數(shù)
- setImmediate(function(doc, win){
- //do something
- }, document, window);
用這個(gè)方式來傳遞可選的參數(shù)意味著你不需要總是使用一個(gè)閉包來讓函數(shù)包含一些有用的信息。
setImmediate()可以讓瀏覽器不需要去管理進(jìn)程的定時(shí)器。不需要去等待更耗電的系統(tǒng)中斷,瀏覽器只需要等待UI隊(duì)列空閑,然后把新的JavaScript任務(wù)插入進(jìn)去。Node.js的開發(fā)者會(huì)比較容易理解這個(gè)問題,因?yàn)閜rocess.nextTick()在自己的環(huán)境里做了相同的事情。
現(xiàn)在只有ie10支持這個(gè)方法,而且因?yàn)檫€沒有完全定下來,所以使用了msSetIntermediate()。IE10的Test Drive上也有一個(gè)setImmediate()的例子,展示了新方法帶來的性能提升。這個(gè)例子使用一個(gè)延遲來排列一些數(shù)據(jù),排序之后的狀態(tài)會(huì)直接展示出來。
原文:http://w3ctech.com/b/archives/597
本文名稱:使用setimmediate實(shí)現(xiàn)可伸縮執(zhí)行的腳本
標(biāo)題鏈接:http://www.5511xx.com/article/cdeseos.html


咨詢
建站咨詢
