js性能優化--學習筆記

《高性能網站建設進階指南》:

1.使用局部變量,避免深入作用域查找,局部變量是讀寫速度最快的;把函數中使用次數超過一次的對象屬性和數組存儲為局部變量是一個好方法;比如for循環中的.length通常可以保存為局部變量。

2,多個if時,if順序按概率降序排列

3,當僅判斷一兩個條件時,if通常比switch更快,當有兩個以上條件且條件比較簡單(不是范圍判定)時,switch通常更快;因為多數情況下,switch語句中執行單個條件的時間比if短;

4,循環中把循環變量遞減到0,而不是遞增到長度,把條件改成了與0比較,速度更快,如for(var i=arr.length;i--){};

5,避免for in;for in是用來遍歷對象的可枚舉屬性,需要遍歷整個原型鏈來查找可枚舉屬性,若

Array.prototype.myf=function(){};//(數據屬性默認都是可枚舉的)
var a=['a','b'];for(var p in a){console.log(p+','+a[p]);}

輸出將是:

0,a
1,b
myf,function (){}

對于object同樣如此,所以一般需要用hasOwnProperty來確保只變例對象實例自身的屬性。

若已知對象的屬性,則采用普通的for循環性能優于for in;如var arr=['p1','p2','p3'];for(){process(obj[arr[i]]);}

6,性能優化:拆分js,減少初次render的下載量,注意會出現用戶點擊時,事件綁定還沒完成的情況。js延遲下載;

7,css選擇符;匹配順序是從右到左的;避免通配符,用classname代替標簽名,利用屬性繼承。。。。。。

?

《高性能javascript》:

?V8 引擎由以下幾個核心部分組成:

  • 基本編譯器(base compiler),在你的代碼運行之前,它會分析你的 JavaScript 代碼并生成本地機器碼,而不是執行字節碼或簡單地解釋它。這種機器碼起初是沒有被高度優化的。
  • V8 將對象解析為對象模型(object model)。對象是在 JavaScript 中是以關聯數組的方式呈現的,但是在 V8 引擎中,它們是通過隱藏類(hidden classes)的方式來表示的。這是一種可以優化查找的內部類型機制。
  • 一個運行時分析器(runtime profiler),它監視正在運行的系統,并標識 “hot” 函數,也就是那些最后會花費大量運行時間的代碼。
  • 一個優化編譯器(optimizing compiler),它重新編譯和優化那些被運行時分析器標識為 “hot” 的代碼,并進行 “內聯” 等優化(例如,在函數被調用的地方用函數主體去取代)。
  • V8支持逆優化(deoptimization),這意味著,如果優化編譯器發現在某些假定的情況下,把一些已經優化的代碼進行了過度的優化,它會舍棄優化后的代碼。
  • 垃圾回收器,理解它的運作原理和理解如何優化你的JavaScript代碼同等重要。

垃圾回收是內存管理的一種機制,垃圾回收器的概念是,它將試圖回收那些不再被使用的對象所占據的內存,在像 JavaScript 這種支持垃圾回收的語言中,如果程序中仍然存在指向一個對象的引用,那么該對象將不會被回收。

在大多數情況下,我們沒有必要去手動得解除對象的引用(de-referencing)。只需要簡單滴將變量放在需要它們的位置(在理想的情況下,盡可能使用局部變量,也就是說,在它們被使用的函數中聲明它們,而不是在更外層的作用域),垃圾就能正確地被回收。

在 JavaScript 中,強制進行垃圾回收是不可能的,而且你也不應該嘗試這樣做,因為垃圾回收是由運行時控制,并且它通常知道垃圾回收的最佳時機。在可能的情況下,盡量避免使用?delete

盡管如此,你肯定會發在許多流行的 JavaScript 庫中使用了 delete - 這有它語言目的。這里的主旨是,避免在運行時修改 “hot” 對象的結構,JavaScript 引擎可以檢測到這些 “hot” 的對象,并嘗試對其進行優化。如果在對象的生命期中沒有遇到重大的結構改變,引擎的檢測和優化過程會來得更加容易,而使用?delete?則會觸發對象結構上的這種改變。

不少人對?null?的使用上也存在誤解。將一個對象引用設置為?null,并不是意味著“清空”該對象,只是將它的引用指向?null。使用?o.x = null?比使用?delete?會更好些,但這甚至可能也是不必要的。

如果此引用是當前對象的最后引用,那么該對象就滿足了垃圾回收的資格。如果此引用不是當前對象的最后引用,則該對象是可訪問的,而不會被垃圾回收。

另外需要注意的是,全局變量在頁面的生命周期中是不會被垃圾回收器清理的。只要頁面保持打開狀態,全局對象就會常駐在內存當中。只有當刷新頁面、導航到其他頁面、關閉標簽頁或退出瀏覽器時,全局變量才會被清理。函數作用域的變量超出作用域范圍時,它就會被清理。當函數完全結束,并且再沒有任何引用指向其中的變量,函數中的變量會被清理。

經驗法則:

為了使垃圾回收器盡早回收盡可能多的對象,請不要保留(hold on)不再需要的對象。(qi:比如在函數里return一個不需要的變量,因為這會導致變量不會被回收)這里有幾點需要謹記:

  • 就像之前所說的那樣,比手動刪除變量引用更好的方式是,在恰當的作用域中使用變量,例如,盡量在函數作用域中聲明變量,而盡可能不要聲明不會被回收的全局變量,這將意味著更干凈更省心的代碼。
  • 確保解綁那些不再需要的事件監聽器,尤其是那些即將被移除的 DOM 對象所綁定的事件。
  • 如果你正在使用數據緩存,確保手動清理緩存或者使用衰老機制,避免緩存中儲存大量不會被重用的數據。

數組字面量非常有用,它可以暗示數組的大小和類型。它通常用在體積不大的數組中。

?
// V8 知道你需要一個長度為 4 并且儲存數字的數組:
var a = [1, 2, 3, 4];

// 不要這樣做:
a = []; // V8 將對數組一無所知
for(var i = 1; i <= 4; i++) {
a.push(i);
}

qi:閉包也會導致變量不會被回收,事件委托:$('table').on('click',?td,?...)優于$('table?td').on('click', ...)

當瀏覽器重新渲染文檔中的元素時需要重新計算它們的位置和幾何形狀時,我們稱之為回流。回流會阻塞用戶在瀏覽器中的操作,因此理解提升回流時間是非常有幫助的。使用document.createDocumentFragment()創建了一虛擬的節點對象(節點對象包含所有屬性和方法),保存多個小節點后在append;在所有節點類型中,只有文檔片段DocumentFragment在文檔中沒有對應的標記。DOM規定文檔片段(documentfragment)是一種”輕量級“的文檔,可以包含和控制節點,但不會像完整的文檔那樣占用額外資源。即當請求把一個 DocumentFragment 節點插入文檔樹時,插入的不是 DocumentFragment 自身,而是它的所有子孫節點。這使得 DocumentFragment 成了有用的占位符,暫時存放那些一次插入文檔的節點。它還有利于實現文檔的剪切、復制和粘貼操作,尤其是與 Range 接口一起使用時更是如此.

qi: css性能:盡量repaint而不是reflow.

顯式設置圖片的寬高:

當瀏覽器加載頁面的HTML代碼時,有時候需要在圖片下載完成前就對頁面布局進行定位。如果HTML里的圖片沒有指定尺寸(寬和高),或者代碼描述的尺寸與實際圖片的尺寸不符時,瀏覽器則要在圖片下載完成后再“回溯”該圖片并重新顯示,這會消耗額外時間。所以,最好為頁面里的每一張圖片都指定尺寸,不管是在頁面HTML里的<img>標簽,還是在CSS里。

瀏覽器解析頁面順序:參考http://www.alloyteam.com/2015/05/wang-ye-xing-neng-zhi-html-css-javascript/;

qi:瀏覽器得到某個頁面后,按順序開始解析,遇到css file和image,發相應的請求,同時繼續往下,到結束就構建好了無樣式的dom tree,css file下載后解析得到CSSOM,結合dom tree開始渲染得到render tree,至此在chrome developer tool里就是domComplete完成的時間(藍色豎線),等image下載好插入render tree,至此在chrome developer tool里就是domLoader完成的時間(紅色豎線).因為js有可能改變dom tree結構,所以如果遇到js file會暫時停止其他渲染行為,等js解析完成后再渲染。?使用async標識的javascript,瀏覽器將異步執行javascript不會阻塞正常的dom渲染。

轉載于:https://www.cnblogs.com/yigeqi/p/4598771.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255334.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

struct和typedef struct在C與C++中用法

struct和typedef struct 分三塊來講述&#xff1a;   1 首先&#xff1a;//注意在C和C里不同     在C中定義一個結構體類型要用typedef:     typedef struct Student    {    int a;    }Stu;     于是在聲明變量的時候就可&#xff1a;Stu stu1;(如…

【數據庫學習】——Python實現mysql數據庫SQL文件生成和導入

目錄 1、將mysql數據導出到SQL文件中&#xff08;數據庫存在的情況&#xff09; 2、將現有的sql文件數據導入到數據庫中&#xff08;前提數據庫存在&#xff09; 3、利用Navicat導出SQL文件和導入SQL文件 1&#xff09;從數據庫導出SQL文件 2&#xff09;導入SQL文件到數據…

lfcp——PB使用

場景&#xff1a;記錄以備忘。 1 直接說明 pb連接說明&#xff1a;目前項目共有性能、功能、業務、聯調四個環境。所以pb可以連接四個不同的數據庫。1.copy一份pb程序&#xff0c;修改main.ini文件中的DBCONNECT/DBCONNECT2位new&#xff0c;DBNAME/DBNAME2為oracle數據源中的源…

【重磅】Google官方推出了免費的、中文的、機器學習初級課程。

2019獨角獸企業重金招聘Python工程師標準>>> 機器學習(Machine Learning, ML)是一門多領域交叉學科&#xff0c;涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多門學科。它是人工智能的核心&#xff0c;是使計算機具有智能的根本途徑&#xff0c;其應用遍及…

市面上常見arduino版本比較

http://arduino.cc/en/Main/Products 詳細鏈接 如果是入門&#xff0c;那么首選UNO R3&#xff0c;方便又省心 如果不是特殊要求&#xff0c;不建議購買2560&#xff0c;因為貴啊 nano是塊很好的控制器&#xff0c;買不買隨你咯 非特殊場合使用不建…

leetcode-114. Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example,Given 1/ \2 5/ \ \3 4 6The flattened tree should look like: 1\2\3\4\5\6思路&#xff1a;遞歸處理&#xff0c;引用二叉鏈表的思想&#xff0c;使用pre記錄上一個分支的指針。Accepted Co…

HALCON示例程序autobahn高速公路車道識別程序剖析

HALCON示例程序autobahn高速公路車道識別程序剖析 小哥哥小姐姐覺得有用點個贊唄&#xff01; 示例程序源碼&#xff08;加注釋&#xff09; *關閉halcon窗口的實時更新 dev_update_window (‘off’) *關閉halcon圖形窗口 dev_close_window () *打開圖形窗口 *dev_open_win…

CSS中的未定義行為,瀏覽器的差異(一)

今天看了張鑫旭大佬的新書的有感吧&#xff0c;記錄一下。 Web標準未對一些場景做出明確規范&#xff0c;所以各大瀏覽器廠家只能根據自己的理解和喜好去實現&#xff0c;表現差異不是瀏覽器的bug&#xff0c;用計算機領域的術語描述為"未定義行為"。 比如一個例子&a…

KVC 和 KVO

作者 沖破繭縛 2015.08.28 16:12* 寫了3967字&#xff0c;被8人關注&#xff0c;獲得了14個喜歡KVC 和 KVO 字數363 閱讀32 評論0 喜歡0KVC (Key Value Coding)&#xff0c;鍵值編碼&#xff0c;通過鍵值&#xff08;字符串&#xff09;來訪問屬性的機制&#xff0c;來間接修改…

Atmel megaAVR控制器 串行引導Bootloader

開始研究下Bootloader的代碼結構 2015.1.9 粗略看了下&#xff0c;Bootloader主要做了下板卡的初始化 -----> 然后進入for( ; ; )死循環 -----> 循環刷新串口數據 -----> 根據數據做出不同應答 -----> 如果有寫數據&#xff0c;則將數據存入buffer …

MapReduce入門2-流量監控

3、流量監控匯總&#xff08;使用LongWritable實現&#xff09; hdfs文件路徑&#xff1a;/tmp/flow.txt 查看文件內容&#xff1a; 13770759991 50 100 25 400 13770759991 800 600 500 100 13770759992 400 300 250 1400 13770759992 800 1200 600 900字符串含義&#xff1a;…

【fiddler學習問題記錄】——手機端證書下載頁打不開、無法將此證書安裝(已解決)

目錄 1、手機端下載頁打不開 解決方法1&#xff09;電腦端——將網絡設置成公用&#xff08;親測有效&#xff09; 解決方法2&#xff09;手機端將fiddler設置為信任應用&#xff0c;不被攔截 &#xff08;未試&#xff09; 2、無法將此證書安裝 方法一&#xff1a;修改證書…

HALCON示例程序ball電路板焊點識別、檢測、測量程序剖析

HALCON示例程序ball電路板焊點識別、檢測、測量程序剖析 示例程序源碼&#xff08;加注釋&#xff09; 介紹&#xff1a; ball.hdev: Inspection of Ball Bonding *halcon窗口實時更新關閉 dev_update_window (‘off’) *halcon關閉所有窗口 dev_close_window () *halcon打開…

舵機的原理和控制

控制信號由接收機的通道進入信號調制芯片&#xff0c;獲得直流偏置電壓。它內部有一個基準電路&#xff0c;產生周期為20ms&#xff0c;寬度為1.5ms的基準信號&#xff0c;將獲得的直流偏置電壓與電位器的電壓比較&#xff0c;獲得電壓差輸出。最后&#xff0c;電壓差的正負輸出…

HDFS清理壞塊

報錯 Failed with exception java.io.IOException:org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1921057509-192.168.57.129-1517160177567:blk_1073741930_1106 file/user/hive/warehouse/db_hive.db/student/student.txt Time taken: 0.104 se…

如何在PowerDesigner將PDM導出生成WORD文檔或者html文件

a) 使用PowerDesigner打開pdm文件 b) 點擊Report Temlates 制作模板 點擊PowerDesigner菜單欄“Report” -> “Report Templates” c) 選擇模板數據項 完成步驟a&#xff09;&#xff0c;得到如下界面&#xff0c;左右2個區&#xff0c;Aavailable區…

【軟件測試】——基礎篇(軟件測試技術體系、過程管理)

目錄 軟件測試技術體系 軟件測試過程管理?編輯 接口測試用例設計 手機端測試流程?編輯 軟件測試技術體系 軟件測試過程管理 接口測試用例設計 手機端測試流程

vue 的常用模塊安指令(持續記錄)

# 全局安裝 vue-cli $ cnpm install --global vue-cli# 創建一個基于 webpack 模板的新項目 $ vue init webpack my-project # 路由管理模塊 $ npm install vue-router --save # 狀態管理模塊 $ npm install vuex --save # 網絡請求模塊 $ npm install vue-resource --save # 停…

HALCON基于形狀匹配詳解

HALCON基于形狀的模板匹配詳細說明 很早就想總結一下前段時間學習HALCON的心得&#xff0c;但由于其他的事情總是抽不出時間。去年有過一段時間的集中學習&#xff0c;做了許多的練習和實驗&#xff0c;并對基于HDevelop的形狀匹配算法的參數優化進行了研究&#xff0c;寫了一…

俄羅斯:自由軟件在這里生根

2008年6月15日&#xff0c;我在“俄羅斯&#xff1a;自由軟件在這里起飛“一文中介紹了自由軟件在俄羅斯的發展情況。現在&#xff0c;許多年過去了&#xff0c;實際情況如何呢&#xff1f; 回顧以往&#xff0c;俄羅斯境內自由軟件的精英們&#xff0c;在2001年組建了ALTLinux…