javascript 效能分析 字串和正規表示式

2021-06-19 03:22:38 字數 1613 閱讀 5550

幾乎所有的js都與字串操作緊密相連。典型的就是ajax從伺服器獲取字串將這些字串轉換成更容易的js物件,然後從資料中生成html字串。包含合併,分解,重新排列,搜尋,遍歷,以及其他方法處理字串。

1.plus (+) and plus-equals (+=) operators 加或加等於操作

str += "one" + "two";

上面發生的步驟:

記憶體中建立了乙個臨時字串

臨時字串被賦值於「onetwo」

臨時字串與str的值進行鏈結

結果賦值為str

str += "one";

str += "two";

但這個鏈結避免了臨時字串的建立速度更快。

str = str + "one" + "two";  合併多個短字串比鏈結乙個大字串更快(避免多次拷貝那些大字串) 這個表示式拷貝了2次str 合併了2次 比 str = "one" + "two"; 而這個表示式 建立了臨時字串和2次拷貝大字串 效能衝擊要輕得多。

firefox 和編譯期合併:firefox所有的字串都屬於編譯期常量 firefox自動在編譯過程中合併他們。這樣速度更快。

array.prototype.join 陣列鏈結字串

上面的** 可以用陣列鏈結改進

string.prototype.concat  字串原有屬性追加字串

但是concat 屬性比+和+=速度要慢

正規表示式:

一 工作原理:當你建立乙個正規表示式物件後(使用正規表示式直接量或regexp構造器)瀏覽器會檢測有沒有模版錯誤,然後轉換為本機**列程 用於執行匹配工作

二 設定起始位置: 確定目標字串的搜尋開始位置 是字串的開始位置還是指定的開始位置。或嘗試失敗後將最後嘗試的位置推後乙個位置進行搜尋。在這個階段各個瀏覽器廠商優化正規表示式引擎  主要跳過沒有必要的步驟。

三 匹配每個正規表示式的字元:乙個乙個掃瞄文字和匹配模版 失敗後回溯到掃瞄之前的位置上。

四 匹配成功或失敗

分支和回溯:

重複和回溯:

var str = "para 1.

" +"

"para 2.

" +"div.

";/.*/i.test(str);

*是貪婪量詞 可以改用非貪婪量詞 *?嘗試的匹配的過程不同

回溯失控:

/[\s\s]*?[\s\s]*?[\s\s]*?[\s\s]*?

[\s\s]*?[\s\s]*?[\s\s]*?/  

如果目標字串缺少乙個或多個標籤的時候 情況很糟糕

/(?:(?!)[\s\s])*(?:(?!)[\s\s])*

(?:(?!)[\s\s])*(?:(?!)[\s\s])*

(?:(?!)[\s\s])*(?:(?!)[\s\s])*

(?:(?!)[\s\s])*/

這個改進的雖然可以避免回溯失控但是效率非常底下。

使用前瞻和後向引用列舉原子組:

/(?=([\s\s]*?))\1(?=([\s\s]*?))\2(?=([\s\s]*?

))\3(?=([\s\s]*?))\4(?=([\s\s]*?))\5

(?=([\s\s]*?))\6[\s\s]*?/

JavaScript效能問題

首先說明,這裡不是測試string 操作和用stringbuffer進行字串 的效能區別。測試環境為ie6 sp2。下面的測試函式在頁面中沒有包含任何其他指令碼 檔案時的執行時間為15毫秒,而當頁面中引用一些無關的指令碼的檔案時 引用了10多個其他指令碼檔案,都跟這段 無關 執行時間變為400 毫秒...

JavaScript效能優化

盡量使用區域性變數 減少全域性變數的使用 可以縮小查詢的作用域鏈。使用變數和陣列要比訪問物件上的屬性更有效率。對於多重屬性查詢,將多次使用的屬性查詢儲存在區域性變數中。前 window.location.href.substring window.location.href.indexof 後 va...

分析javascript關閉

1.什麼是閉包 1 官方解釋 乙個擁有多個變數和繫結了這些變數的環境的表示式 一般是乙個函式 因而這些變數也是該表示式的一部分。我的理解 所謂的閉包就是連線函式內部和函式外部的一座橋梁。使得在外部也可以訪問到函式內部的變數。2 閉包的特點 a 作為乙個函式變數的乙個引用,當函式返回時,其處於啟用狀態...