九九精品影院-九九精品在线-九九精品在线播放-九九九国产-国产成+人+综合+亚洲不卡-国产成a人片在线观看视频

蒙狼科技logo
設(shè)為首頁| 聯(lián)系我們
咨詢熱線: 13917498722
  您的位置: 首頁 > 網(wǎng)站資訊 > 編寫高性能javascript

編寫高性能javascript

發(fā)布日期:2017/6/16

百度權(quán)重查詢 站長交易 友情鏈接交換 網(wǎng)站監(jiān)控 服務(wù)器監(jiān)控 seo監(jiān)控

許多javascript引擎,如Google的V8引擎(被Chrome和Node所用),是專門為需要快速執(zhí)行的大型javascript應(yīng)用所設(shè)計的。假如你是一個開發(fā)者,并且關(guān)心內(nèi)存使用情況與頁面性能,你應(yīng)該了解用戶瀏覽器中的javascript引擎是如何運(yùn)作的。無論是V8,SpiderMonkey的(Firefox)的Carakan(Opera),Chakra(IE)或其他引擎,這樣做可以幫助你更好地優(yōu)化你的應(yīng)用程序。這并不是說應(yīng)該專門為某一瀏覽器或引擎做優(yōu)化,萬萬別這么做。

但是,你應(yīng)該問自己幾個問題:

•在我的代碼里,是否可以使代碼更高效一些

•主流的javascript引擎都做了哪些優(yōu)化

•什么是引擎無法優(yōu)化的,垃圾回收器(GC)是否能回收我所期望的東西

加載快速的網(wǎng)站就像是一輛快速的跑車,需要用到特殊定制的零件

編寫高性能代碼時有一些常見的陷阱,在這篇文章中,我們將展示一些經(jīng)過驗證的、更好的編寫代碼體例。

那么,javascript在V8里是如何工作的?

假如你對JS引擎沒有較深的了解,開發(fā)一個大型Web應(yīng)用也沒啥問題,就好比會開車的人也只是看過引擎蓋而沒有看過車蓋內(nèi)的引擎一樣。鑒于Chrome是我的瀏覽器,所以談一下它的javascript引擎。V8是由以下幾個核心部分組成:

•一個基本的編譯器,它會在代碼執(zhí)行前解析javascript代碼并生成本地機(jī)器碼,而不是執(zhí)行字節(jié)碼或簡單地詮釋它。這些代碼好開始并不是高度優(yōu)化的。

•V8將對象構(gòu)建為對象模型。在javascript中對象體現(xiàn)為關(guān)聯(lián)數(shù)組,但是在V8中對象被看作是隱藏的類,一個為了優(yōu)化查詢的內(nèi)部類型系統(tǒng)。

•運(yùn)行時分析器監(jiān)視正在運(yùn)行的系統(tǒng),并標(biāo)識了“hot”的函數(shù)(例如花費(fèi)很長時間運(yùn)行的代碼)。

•優(yōu)化編譯重視新編譯和優(yōu)化那些被運(yùn)行時分析器標(biāo)識為“hot”的代碼,并進(jìn)行“內(nèi)聯(lián)”等優(yōu)化(例如用被調(diào)用者的主體替代函數(shù)調(diào)用的位置)。

•V8支撐去優(yōu)化,這意味著優(yōu)化編譯器假如發(fā)現(xiàn)對于代碼優(yōu)化的假設(shè)過于樂觀,它會舍棄優(yōu)化過的代碼。

•V8有個垃圾收集器,了解它是如何工作的和優(yōu)化javascript一樣主要。

垃圾回收

垃圾回收是內(nèi)存管理的一種形式,其實就是一個收集器的概念,嘗試回收不再被使用的對象所占用的內(nèi)存。在javascript這種垃圾回收語言中,應(yīng)用程序中仍在被引用的對象不會被消滅。

手動消弭對象引用在大多數(shù)情況下是沒有需要的。通過簡單地把變量放在需要它們的地方(理想情況下,盡可能是局部作用域,即它們被使用的函數(shù)里而不是函數(shù)外層),一切將運(yùn)作地很好。

垃圾回收器嘗試回收內(nèi)存

在javascript中,是不可能強(qiáng)制進(jìn)行垃圾回收的。你不應(yīng)該這么做,因為垃圾收集過程是由運(yùn)行時控制的,它知道什么是好好的清理時機(jī)。

“消弭引用”的誤解

網(wǎng)上有許多關(guān)于javascript內(nèi)存回收的討論都談到delete這個關(guān)鍵字,雖然它可以被用來刪除對象(map)中的屬性(key),但有部分開發(fā)者認(rèn)為它可以用來強(qiáng)制“消弭引用”。建議盡可能避免使用delete,在下面的例子中delete o.x 的弊大于利,因為它改變了o的隱藏類,并使它成為一個"慢對象"。

var o = { x:1 };

delete o.x; // true

o.x; // undefined

你會很容易地在流行的JS庫中找到引用刪除——這是具有語言目的性的。這里需要注重的是避免在運(yùn)行時修改”hot”對象的結(jié)構(gòu)。javascript引擎可以檢測出這種“hot”的對象,并嘗試對其進(jìn)行優(yōu)化。假如對象在生命周期中其結(jié)構(gòu)沒有較大的改變,引擎將會更容易優(yōu)化對象,而delete操作現(xiàn)實上會觸發(fā)這種較大的結(jié)構(gòu)改變,因此不利于引擎的優(yōu)化。

對于null是如何工作也是有誤解的。將一個對象引用設(shè)置為null,并沒有使對象變“空”,只是將它的引用設(shè)置為空而已。使用o.x= null比使用delete會更好些,但可能也不是很需要。

var o = { x:1 };

o = null;

o; // null

o.x // TypeError

假如此引用是當(dāng)前對象的好后引用,那么該對象將被作為垃圾回收。假如此引用不是當(dāng)前對象的好后引用,則該對象是可訪問的且不會被垃圾回收。

另外需要注重的是,全局變量在頁面的生命周期里是不被垃圾回收器清理的。無論頁面打開多久,javascript運(yùn)行時全局對象作用域中的變量會一向存在。

var myGlobalNamespace = {};

全局對象只會在刷新頁面、導(dǎo)航到其他頁面、關(guān)閉標(biāo)簽頁或退出瀏覽器時才會被清理。函數(shù)作用域的變量將在超出作用域時被清理,即退出函數(shù)時,已經(jīng)沒有任何引用,這樣的變量就被清理了。

經(jīng)驗法則

為了使垃圾回收器盡早收集盡可能多的對象,不要hold著不再使用的對象。這里有幾件事需要記住:

•正如前面提到的,在合適的范圍內(nèi)使用變量是手動消弭引用的更好選擇。即一個變量只在一個函數(shù)作用域中使用,就不要在全局作用域聲明它。這意味著更干凈省心的代碼。

•確保解綁那些不再需要的事件監(jiān)聽器,尤其是那些即將被銷毀的DOM對象所綁定的事件監(jiān)聽器。

•假如使用的數(shù)據(jù)緩存在本地,確保清理一下緩存或使用老化機(jī)制,以避免大量不被重用的數(shù)據(jù)被存儲。

函數(shù)

接下來,我們談?wù)労瘮?shù)。正如我們已經(jīng)說過,垃圾收集的工作原理,是通過回收不再是訪問的內(nèi)存塊(對象)。為了更好地說明這一點,這里有一些例子。

function foo(){

var bar = new LargeObject();

bar.someCall();

}

當(dāng)foo返回時,bar指向的對象將會被垃圾收集器主動回收,因為它已沒有任何存在的引用了。

對比一下:

function foo(){

var bar = new LargeObject();

bar.someCall();

return bar;

}

// somewhere else

var b = foo();

現(xiàn)在我們有一個引用指向bar對象,這樣bar對象的生存周期就從foo的調(diào)用一向持續(xù)到調(diào)用者指定別的變量b(或b超出范圍)。

閉包(CLOSURES)

當(dāng)你看到一個函數(shù),返回一個內(nèi)部函數(shù),該內(nèi)部函數(shù)將獲得范圍外的訪問權(quán),即使在外部函數(shù)執(zhí)行之后。這是一個基本的閉包 —— 可以在特定的上下文中設(shè)置的變量的表達(dá)式。例如:

function sum (x){

function sumIt(y){

return x + y;

};

return sumIt;

}

// Usage

var sumA = sum(4);

var sumB = sumA(3);

console.log(sumB); // Returns 7

在sum調(diào)用上下文中生成的函數(shù)對象(sumIt)是無法被回收的,它被全局變量(sumA)所引用,并且可以通過sumA(n)調(diào)用。

讓我們來看看另外一個例子,這里我們可以訪問變量largeStr嗎?

var a = function (){

var largeStr = new Array(1000000).join(‘x’);

return function (){

return largeStr;

};

}();

是的,我們可以通過a()訪問largeStr,所以它沒有被回收。下面這個呢?

var a = function (){

var smallStr = ‘x’;

var largeStr = new Array(1000000).join(‘x’);

return function (n){

return smallStr;

};

}();

我們不能再訪問largeStr了,它已經(jīng)是垃圾回收候選人了。【譯者注:因為largeStr已不存在外部引用了】

準(zhǔn)時器

好糟的內(nèi)存泄露地方之一是在循環(huán)中,或者在setTimeout()/ setInterval()中,但這是相當(dāng)常見的。思考下面的例子:

var myObj = {

callMeMaybe:function (){

var myRef = this;

var val = setTimeout(function (){

console.log(‘Time is running out!’);

myRef.callMeMaybe();

},1000);

}

};

假如我們運(yùn)行myObj.callMeMaybe();來啟動準(zhǔn)時器,可以看到控制臺每秒打印出“Time is running out!”。假如接著運(yùn)行myObj = null,準(zhǔn)時器依舊處于激活狀況。為了能夠持續(xù)執(zhí)行,閉包將myObj傳遞給setTimeout,這樣myObj是無法被回收的。相反,它引用到myObj的因為它捕捉了myRef。這跟我們?yōu)榱吮3忠脤㈤]包傳給其他的函數(shù)是一樣的。

同樣值得牢記的是,setTimeout/setInterval調(diào)用(如函數(shù))中的引用,將需要執(zhí)行和完成,才可以被垃圾收集。

當(dāng)心性能陷阱

永遠(yuǎn)不要優(yōu)化代碼,直到你真正需要。現(xiàn)在經(jīng)常可以看到一些基準(zhǔn)測試,顯示N比M在V8中更為優(yōu)化,但是在模塊代碼或應(yīng)用中測試一下會發(fā)現(xiàn),這些優(yōu)化真正的效果比你期望的要小的多。

做的過多還不如什么都不做. 

比如我們想要創(chuàng)建這樣一個模塊:

•需要一個本地的數(shù)據(jù)源包含數(shù)字ID

•繪制包含這些數(shù)據(jù)的表格

•添加事件處理程序,當(dāng)用戶點擊的任何單元格時切換單元格的css class

這個問題有幾個不同的因素,雖然也很容易解決。我們?nèi)绾未鎯?shù)據(jù),如何高效地繪制表格并且append到DOM中,如何更優(yōu)地處理表格事件?

面對這些問題好開始(無邪)的做法是使用對象存儲數(shù)據(jù)并放入數(shù)組中,使用jQuery遍歷數(shù)據(jù)繪制表格并append到DOM中,好后使用事件綁定我們期望地點擊行為。

注重:這不是你應(yīng)該做的

var moduleA = function (){

return {

data:dataArrayObject,

init:function (){

this.addTable();

this.addEvents();

},

addTable:function (){

for (var i = 0; i <rows; i++){

$tr = $(‘<tr></tr>’);

for (var j = 0; j <this.data.length; j++){

$tr.append(‘<td>’ + this.data[j][‘id’]+ ‘</td>’);

}

$tr.appendTo($tbody);

}

},

addEvents:function (){

$(‘table td’).on(‘click’,function (){

$(this).toggleClass(‘active’);

});

}

};

}();

這段代碼簡單有用地完成了義務(wù)。

但在這種情況下,我們遍歷的數(shù)據(jù)只是本應(yīng)該簡單地存放在數(shù)組中的數(shù)字型屬性ID。有趣的是,直接使用DocumentFragment和本地DOM方法比使用jQuery(以這種體例)來生成表格是更優(yōu)的選擇,當(dāng)然,事件代理比單獨(dú)綁定每個td具有更高的性能。

要注重雖然jQuery在內(nèi)部使用DocumentFragment,但是在我們的例子中,代碼在循環(huán)內(nèi)調(diào)用append并且這些調(diào)用涉及到一些其他的小知識,因此在這里起到的優(yōu)化作用不大。希望這不會是一個痛點,但請務(wù)必進(jìn)行基準(zhǔn)測試,以確保自己代碼ok。

對于我們的例子,上述的做法帶來了(期望的)性能提拔。事件代理對簡單的綁定是一種改進(jìn),可選的DocumentFragment也起到了助推作用。

var moduleD = function (){

return {

data:dataArray,

init:function (){

this.addTable();

this.addEvents();

},

addTable:function (){

var td,tr;

var frag = document.createDocumentFragment();

var frag2 = document.createDocumentFragment();

for (var i = 0; i <rows; i++){

tr = document.createElement(‘tr’);

for (var j = 0; j <this.data.length; j++){

td = document.createElement(‘td’);

td.appendChild(document.createTextNode(this.data[j]));

frag2.appendChild(td);

}

tr.appendChild(frag2);

frag.appendChild(tr);

}

tbody.appendChild(frag);

},

addEvents:function (){

$(‘table’).on(‘click’,‘td’,function (){

$(this).toggleClass(‘active’);

});

}

};

}();

1 2 3 下一頁



其他相關(guān)文章
  • 網(wǎng)站建設(shè)后的轉(zhuǎn)讓問題
  • 網(wǎng)絡(luò)推廣具體方法
  • 多域名同內(nèi)容的常見問題
  • 根據(jù)不同的時期來進(jìn)行優(yōu)化關(guān)鍵詞?
  • 網(wǎng)站SEO關(guān)鍵字排名容易忽略的6個因素
  • 新老域名對于網(wǎng)站建設(shè)的影響




  • 企業(yè)網(wǎng)站后臺使用
    購物網(wǎng)站后臺使用
    網(wǎng)站產(chǎn)品圖片的處理



    農(nóng)業(yè)銀行支付
    建設(shè)銀行支付
    郵政儲蓄銀行支付



    企業(yè)網(wǎng)站建設(shè)
    整站建設(shè)
    購物網(wǎng)站



    企業(yè)網(wǎng)站建設(shè)建議
    注冊適合自己的域名
    什么是虛擬主機(jī)




    售前咨詢QQ: 838821345
    售后服務(wù)QQ: 464698733
    應(yīng)急手機(jī):13917498722


    微信掃一掃
    添加24小時微信客服


    郵箱:lang@MENGL.CN
    地址:上海寶山區(qū)城銀路555弄2號樓3樓
    ICP備案:滬ICP備12042844號-3
     滬公網(wǎng)安備:31011402002917號
    做網(wǎng)站 | 企業(yè)網(wǎng)站建設(shè) | 上海做網(wǎng)站 | 企業(yè)網(wǎng)站制作 | 做網(wǎng)站的公司 | 關(guān)于蒙狼 | 整站建設(shè) | 購物網(wǎng)站 | 企業(yè)網(wǎng)絡(luò)營銷 | 成功案例 | 加盟代理 | 在線訂單
    服務(wù)區(qū)域: 臨港新區(qū)做網(wǎng)站 徐匯做網(wǎng)站 閔行做網(wǎng)站 長寧做網(wǎng)站 虹口做網(wǎng)站 黃浦做網(wǎng)站 盧灣做網(wǎng)站 靜安做網(wǎng)站 浦東做網(wǎng)站 楊浦做網(wǎng)站 普陀做網(wǎng)站 閘北做網(wǎng)站 寶山做網(wǎng)站 嘉定做網(wǎng)站 松江做網(wǎng)站 昆山做網(wǎng)站
    Copyright 2012-2025 上海蒙狼網(wǎng)絡(luò)科技有限公司 www.dylawyer.com.cn All Rights Reserved
    日韩一级黄色片| 国产成人啪精品视频免费软件| 一级片片| 成人免费福利片在线观看| 免费国产在线视频| 国产视频一区二区在线观看| 欧美激情一区二区三区视频高清| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 九九精品久久久久久久久| 九九干| 黄色福利| 日日日夜夜操| 黄视频网站在线看| 午夜在线亚洲男人午在线| 可以免费看毛片的网站| 黄视频网站免费观看| 精品视频在线观看视频免费视频| 九九久久国产精品大片| 国产一区二区高清视频| 黄色免费三级| 精品视频在线观看视频免费视频| 精品国产一区二区三区免费 | 日韩中文字幕一区| 999精品视频在线| 国产不卡福利| 欧美a免费| 精品久久久久久中文| 日韩中文字幕在线播放| 国产一区二区高清视频| 高清一级片| 免费国产在线观看| 久草免费在线观看| 亚洲精品影院一区二区| 国产91精品露脸国语对白| 一本高清在线| 久久精品大片| 成人免费观看网欧美片| 99久久精品费精品国产一区二区| 久久国产精品自由自在| 日本伦理片网站| 精品视频在线观看视频免费视频| 日韩专区第一页| 日日夜夜婷婷| 久久精品道一区二区三区| 黄视频网站在线免费观看| 国产成人女人在线视频观看| 日韩免费在线| 欧美激情影院| 国产一区精品| 一级片免费在线观看视频| 美女被草网站| 午夜欧美成人香蕉剧场| 亚洲天堂免费| 成人高清免费| 精品在线观看一区| a级黄色毛片免费播放视频| 亚洲第一页色| 国产网站在线| 欧美一区二区三区性| 精品国产一区二区三区久久久蜜臀 | 日韩中文字幕在线观看视频| 国产精品自拍在线观看| 久久福利影视| 日本伦理网站| 国产麻豆精品免费密入口| 欧美激情在线精品video| 国产不卡精品一区二区三区| 亚洲www美色| 九九精品久久久久久久久| 99久久精品国产国产毛片| 四虎影视库| 久久精品免视看国产成人2021| 欧美日本国产| 韩国三级香港三级日本三级| 成人免费网站视频ww| 欧美大片一区| 精品视频一区二区三区| 日本伦理黄色大片在线观看网站| 一级片片| 四虎影视久久久| 99久久精品费精品国产一区二区| 久久久久久久免费视频| 国产视频在线免费观看| 久久精品免视看国产成人2021| 色综合久久久久综合体桃花网| 免费国产一级特黄aa大片在线| 日韩在线观看免费| 午夜在线亚洲男人午在线| 亚洲第一页色| 国产精品自拍一区| 色综合久久久久综合体桃花网| 欧美激情一区二区三区视频| 精品视频免费在线| 精品国产一级毛片| 九九九网站| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 一级片片| 成人在激情在线视频| 韩国毛片免费| 九九精品影院| 国产成人精品综合| 欧美激情一区二区三区视频高清 | 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 深夜做爰性大片中文| 精品视频在线观看一区二区三区| 99久久精品国产麻豆| 91麻豆爱豆果冻天美星空| 国产不卡高清| 久久99中文字幕| 国产不卡福利| 欧美大片毛片aaa免费看| 国产成人精品一区二区视频| 国产成人啪精品视频免费软件| 高清一级毛片一本到免费观看| 午夜久久网| 精品久久久久久综合网| 亚欧成人乱码一区二区| 日本免费看视频| 日韩免费片| 天堂网中文在线| 999久久66久6只有精品| 一级片片| 日韩在线观看视频免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 一 级 黄 中国色 片| 亚洲wwwwww| 91麻豆爱豆果冻天美星空| 欧美激情一区二区三区视频高清| 午夜精品国产自在现线拍| 欧美α片无限看在线观看免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美爱色| 91麻豆高清国产在线播放| 成人av在线播放| 一级毛片看真人在线视频| 国产一区二区精品久久91| 成人免费观看网欧美片| 欧美另类videosbestsex久久 | 日韩欧美一二三区| 天天做日日爱夜夜爽| 成人免费福利片在线观看| 国产精品免费久久| 国产国语对白一级毛片| 一级女性大黄生活片免费| 精品国产亚洲人成在线| 韩国毛片免费| 亚洲女人国产香蕉久久精品| 黄视频网站免费观看| 97视频免费在线观看| 国产亚洲免费观看| 91麻豆精品国产高清在线| 国产韩国精品一区二区三区| 国产网站免费观看| 欧美1区2区3区| 黄视频网站免费| 精品国产一级毛片| 成人免费观看网欧美片| 亚飞与亚基在线观看| 欧美国产日韩在线| 国产激情一区二区三区| 四虎影视久久久| 国产成人精品综合久久久| 精品视频一区二区| 国产综合91天堂亚洲国产| 欧美另类videosbestsex视频| 欧美大片aaaa一级毛片| 日韩在线观看视频网站| 日韩字幕在线| 国产美女在线一区二区三区| 人人干人人插| 日韩在线观看视频免费| 一级女性全黄生活片免费| 成人免费一级纶理片| 国产不卡在线观看| 国产成人精品综合| 黄色福利片| 日韩在线观看免费| a级精品九九九大片免费看| 国产成a人片在线观看视频| 久久精品店| 国产极品精频在线观看| 国产极品白嫩美女在线观看看| 国产成人精品一区二区视频| 日本免费区| 精品久久久久久免费影院| 99久久网站| 久久精品免视看国产成人2021| 97视频免费在线观看| 一本高清在线| 国产精品免费久久| 欧美α片无限看在线观看免费| 麻豆污视频| 二级片在线观看| 久草免费资源| 日韩中文字幕一区| 高清一级片| 九九干| 人人干人人插| 精品视频在线观看视频免费视频| 国产麻豆精品hdvideoss|