首頁 web前端 js教程 總結五大JavaScript優化原則

總結五大JavaScript優化原則

Apr 02, 2018 pm 05:01 PM
javascript

首先,與其他語言不同,JS的效率很大程度是取決於JS engine的效率。除了引擎實現的優劣外,引擎本身也會為一些特殊的程式碼模式採取一些最佳化的策略。例如FF、Opera和Safari的JS引擎,都對字串的拼接運算(+)做了特別優​​化。顯然,要獲得最大效率,就必須了解引擎的脾氣,並盡量迎合引擎的口味。所以對於不同的引擎,所做的優化極有可能是背道而馳的。 

而如果做跨瀏覽器的web編程,則最大的問題在於IE6(JScript 5.6)!因為在不打hotfix的情況下,JScript引擎的垃圾回收的bug,會導致其在真實應用中的performance跟其他瀏覽器根本不在一個數量級上。因此在這種場合做優化,其實就是為JScript做優化! 

所以第一原則就是只需要為IE6(未打補丁的JScript 5.6或更早版本)做最佳化! 

如果你的程式已經優化到在IE6下可以接受的效能,那麼基本上在其他瀏覽器上效能就完全沒有問題。

因此,注意我下面講的許多問題在其他引擎上可能完全不同,例如在循環中進行字串拼接,通常認為需要用Array.join的方式,但是由於SpiderMonkey等引擎對字串的「+」運算做了優化,結果使用Array.join的效率反而不如直接用「+」!但是如果考慮IE6,則其他瀏覽器上的這種效率的差異根本不值一提。 

JS最佳化與其他語言的最佳化也仍有相同之處。比如說,不要一上來就急吼的做優化,那樣毫無意義。優化的關鍵,仍然是要把精力放在最關鍵的地方,也就是瓶頸上。一般來說,瓶頸總是出現在大規模循環的地方。這倒不是說循環本身有效能問題,而是循環會迅速放大可能存在的效能問題。 

所以第二個原則就是以大規模循環體為最主要最佳化物件。 

以下的最佳化原則,只在大規模循環中才有意義,在循環體之外做這類最佳化基本上是沒有意義的。 

目前絕大多數JS引擎都是解釋執行的,而解釋執行的情況下,在所有操作中,函數呼叫的效率是較低的。此外,過深的prototype繼承鏈或多層次引用也會降低效率。在JScript中,10級引用的開銷大致是一次空函數呼叫開銷的1/2。這兩者的開銷都遠大於簡單操作(如四則運算)。 

所以第三個原則就是盡量避免過多的引用層級和不必要的多次方法呼叫。 

特別要注意的是,有些情況下看似是屬性訪問,實際上是方法調用。例如所有DOM的屬性,其實都是方法。在遍歷一個NodeList的時候,循環條件對於nodes.length的訪問,看似屬性讀取,實際上是等價於函數調用的。而且IE DOM的實作上,childNodes.length每次都是要透過內部遍歷重新計數的。 (My god,但這是真的!因為我測過,childNodes.length的存取時間與childNodes.length的值成正比!)這非常耗費。所以預先把nodes.length存到js變量,當然可以提高遍歷的效能。

同樣是函數調用,用戶自訂函數的效率又遠低於語言內建函數,因為後者是對引擎本地方法的包裝,而引擎通常是c, c++,java寫的。進一步,同樣的功能,語言內建構造的開銷通常又比內建函數呼叫要效率高,因為前者在JS程式碼的parse階段就可以確定和最佳化。 

所以第四原則就是盡量使用語言本身的建構與內建函數。 

這裡有一個例子是高效能的String.format方法。 String.format傳統的實作方式是用String.replace(regex, func),在pattern包含n個佔位符(包括重複的)時,自訂函數func就被呼叫n次。而這個高效能實作中,每次format呼叫所做的只是一次Array.join然後一次String.replace(regex, string)的操作,兩者都是引擎內建方法,而不會有任何自訂函數呼叫。兩次內建方法調用和n次的自訂方法調用,這就是效能上的差異。 

同樣是內建特性,性能上還是有差異的。例如在JScript中對於arguments的存取效能就很差,幾乎趕上一次函數呼叫了。因此如果一個可變參數的簡單函數成為效能瓶頸的時候,可以將其內部做一些改變,不要存取arguments,而是透過對參數的明確判斷來處理。

例如: 

Java程式碼  總結五大JavaScript優化原則

  1. function sum() {  
        var r = 0;  
        for (var i = 0; i < arguments.length; i++) {  
            r += arguments[i];  
        }  
        return r;  
    }
    登入後複製


這個sum通常呼叫的時候個數是較少的,我們希望改進它在參數較少時的效能。若改成: 


Java程式碼  總結五大JavaScript優化原則

  1. function sum() {  
        switch (arguments.length) {  
            case 1: return arguments[0];  
            case 2: return arguments[0] + arguments[1];  
            case 3: return arguments[0] + arguments[1] + arguments[2];  
            case 4: return arguments[0] + arguments[1] + arguments[2] + arguments[3];  
            default:  
                var r = 0;  
                for (var i = 0; i < arguments.length; i++) {  
                    r += arguments[i];  
                }  
                return r;  
        }  
    }
    登入後複製


#其實不會有多少提高,但如果改成: 


Java代码 總結五大JavaScript優化原則

  1. function sum(a, b, c, d, e, f, g) {  
        var r = a ? b ? c ? d ? e ? f ? a + b + c + d + e + f : a + b + c + d + e : a + b + c + d : a + b + c : a + b : a : 0;  
        if (g === undefined) return r;  
        for (var i = 6; i < arguments.length; i++) {  
            r += arguments[i];  
        }  
        return r;  
    }
    登入後複製


就会提高很多(至少快1倍)。 

最后是第五原则,也往往是真实应用中最重要的性能障碍,那就是尽量减少不必要的对象创建。 

本身创建对象是有一定的代价的,但是这个代价其实并不大。最根本的问题是由于JScript愚蠢之极的垃圾回收调度算法,导致随着对象个数的增加,性能严重下降(据微软的人自己说复杂度是O(n^2))。 

比如我们常见的字符串拼接问题,经过我的测试验证,单纯的多次创建字符串对象其实根本不是性能差的原因。要命的是在对象创建期间的无谓的垃圾回收的开销。而Array.join的方式,不会创建中间字符串对象,因此就减少了那该死的垃圾回收的开销。 

因此,如果我们能把大规模对象创建转化为单一语句,则其性能会得到极大的提高!例如通过构造代码然后eval——实际上PIES项目中正在根据这个想法来做一个专门的大规模对象产生器…… 

好了上面就是总结的JS优化五大原则。 

以上是總結五大JavaScript優化原則的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles