日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用setimmediate實(shí)現(xiàn)可伸縮執(zhí)行的腳本

看過我對(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ì)列里:

 
 
 
  1. setTimeout(function(){
  2.    //do  something
  3. }, 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>

 
 
 
  1. var id = setImmediate(function(){
  2.     //do something
  3. });

setImmediate()函數(shù)會(huì)返回一個(gè)id,這個(gè)id可以通過clearImmediate()方法來取消這個(gè)過程。

我們也可以給它傳遞一些參數(shù)

 
 
 
  1. setImmediate(function(doc, win){
  2.     //do something
  3. }, 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