編寫高性能javascript

編寫高性能javascript

ID:9088192

大?。?26.41 KB

頁數(shù):24頁

時間:2018-04-17

編寫高性能javascript_第1頁
編寫高性能javascript_第2頁
編寫高性能javascript_第3頁
編寫高性能javascript_第4頁
編寫高性能javascript_第5頁
資源描述:

《編寫高性能javascript》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、編寫高性能JavaScript  英文鏈接:WritingFast,Memory-EfficientJavaScript  很多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)化,千萬

2、別這么做。  但是,你應(yīng)該問自己幾個問題:·在我的代碼里,是否可以使代碼更高效一些·主流的JavaScript引擎都做了哪些優(yōu)化·什么是引擎無法優(yōu)化的,垃圾回收器(GC)是否能回收我所期望的東西  編寫高性能代碼時有一些常見的陷阱,在這篇文章中,我們將展示一些經(jīng)過驗證的、更好的編寫代碼方式。  那么,JavaScript在V8里是如何工作的?  如果你對JS引擎沒有較深的了解,開發(fā)一個大型Web應(yīng)用也沒啥問題,就好比會開車的人也只是看過引擎蓋而沒有看過車蓋內(nèi)的引擎一樣。鑒于Chrome是我的瀏覽器首選,所以談一下它的JavaScript引擎。V8是由以下幾個核心部分組成:·一個基本的編譯

3、器,它會在代碼執(zhí)行前解析JavaScript代碼并生成本地機(jī)器碼,而不是執(zhí)行字節(jié)碼或簡單地解釋它。這些代碼最開始并不是高度優(yōu)化的?!8將對象構(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ù)(例如花費很長時間運(yùn)行的代碼)。·優(yōu)化編譯器重新編譯和優(yōu)化那些被運(yùn)行時分析器標(biāo)識為“hot”的代碼,并進(jìn)行“內(nèi)聯(lián)”等優(yōu)化(例如用被調(diào)用者的主體替換函數(shù)調(diào)用的位置)?!8支持去優(yōu)化,這意味著優(yōu)化編譯器如果發(fā)現(xiàn)對于代碼優(yōu)化的假設(shè)過于樂觀,它會舍棄優(yōu)化過的代碼?!8有個

4、垃圾收集器,了解它是如何工作的和優(yōu)化JavaScript一樣重要?! ±厥铡 ±厥帐莾?nèi)存管理的一種形式,其實就是一個收集器的概念,嘗試回收不再被使用的對象所占用的內(nèi)存。在JavaScript這種垃圾回收語言中,應(yīng)用程序中仍在被引用的對象不會被清除?! ∈謩酉龑ο笠迷诖蠖鄶?shù)情況下是沒有必要的。通過簡單地把變量放在需要它們的地方(理想情況下,盡可能是局部作用域,即它們被使用的函數(shù)里而不是函數(shù)外層),一切將運(yùn)作地很好。  在JavaScript中,是不可能強(qiáng)制進(jìn)行垃圾回收的。你不應(yīng)該這么做,因為垃圾收集過程是由運(yùn)行時控制的,它知道什么是最好的清理時機(jī)。  “消除引用”的誤解  網(wǎng)上

5、有許多關(guān)于JavaScript內(nèi)存回收的討論都談到delete這個關(guān)鍵字,雖然它可以被用來刪除對象(map)中的屬性(key),但有部分開發(fā)者認(rèn)為它可以用來強(qiáng)制“消除引用”。建議盡可能避免使用delete,在下面的例子中deleteo.x的弊大于利,因為它改變了o的隱藏類,并使它成為一個"慢對象"。varo={x:1};deleteo.x;//trueo.x;//undefined  你會很容易地在流行的JS庫中找到引用刪除——這是具有語言目的性的。這里需要注意的是避免在運(yùn)行時修改”hot”對象的結(jié)構(gòu)。JavaScript引擎可以檢測出這種“hot”的對象,并嘗試對其進(jìn)行優(yōu)化。如果對象在

6、生命周期中其結(jié)構(gòu)沒有較大的改變,引擎將會更容易優(yōu)化對象,而delete操作實際上會觸發(fā)這種較大的結(jié)構(gòu)改變,因此不利于引擎的優(yōu)化?! τ趎ull是如何工作也是有誤解的。將一個對象引用設(shè)置為null,并沒有使對象變“空”,只是將它的引用設(shè)置為空而已。使用o.x=null比使用delete會更好些,但可能也不是很必要。varo={x:1};o=null;o;//nullo.x//TypeError  如果此引用是當(dāng)前對象的最后引用,那么該對象將被作為垃圾回收。如果此引用不是當(dāng)前對象的最后引用,則該對象是可訪問的且不會被垃圾回收。  另外需要注意的是,全局變量在頁面的生命周期里是不被垃圾回收器

7、清理的。無論頁面打開多久,JavaScript運(yùn)行時全局對象作用域中的變量會一直存在。varmyGlobalNamespace={};  全局對象只會在刷新頁面、導(dǎo)航到其他頁面、關(guān)閉標(biāo)簽頁或退出瀏覽器時才會被清理。函數(shù)作用域的變量將在超出作用域時被清理,即退出函數(shù)時,已經(jīng)沒有任何引用,這樣的變量就被清理了?! 〗?jīng)驗法則  為了使垃圾回收器盡早收集盡可能多的對象,不要hold著不再使用的對象。這里有幾件事需要記?。骸ふ缜懊嫣岬降模?/p>

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。