標籤:style blog class code java tar
原文:淺談 js 正則字面量 與 new RegExp 執行效率
前幾天談了正則匹配 js 字串的問題:《js 正則學習小記之匹配字串》 和 《js 正則學習小記之匹配字串最佳化篇》。
裡面講到了最佳化正則起到提升效能的問題,但是能提升多少呢?
於是我去測試了,發現TMD幾乎微乎其微,我用1千字串進行100萬次匹配測試,優不最佳化根本沒區別。
這不科學,我白看了這麼多天正則,上天這是在玩弄我麼。
突然我想到了 compile 方法,然後去測試了下,奇蹟出現了,果然最佳化過的快了不少。
但這是為什麼呢?
於是我翻閱資料,在 MDN 上找到了 RegExp Methods
這裡說 compile 方法已被棄用!這不科學。。。
在 stackoverflow 上發現這篇文章 Javascript: what‘s the point of RegExp.compile()?
文章大意是說其實 直接 new RegExp 即可,compile 幾乎用不到。
於是乎我修改了代碼再來一次。
果然,直接 new RegExp 效果和 compile 是一樣的。
不過這隻是 nodejs 下的結果,我們去看看各個瀏覽器下的結果如何吧。
<!doctype html><html lang="en"><head><meta charset="UTF-8"><title>test</title></head><body><script>var str1 = ‘"‘+Array(100).join("x")+‘123456\\\‘78\\\"90"‘;var str2 = ‘"‘+Array(100).join("x")+‘ooo\\\\oooo\\\nxxxx\\\"xxxx"‘;// 這裡寫100,小一點,防止等半天,FF那慫貨就半天console.log("字串1:", str1);console.log("字串2:", str2);var reg1 = /"(?:\\.|[^"])*"/;var reg2 = /"(?:[^"\\]|\\[\d\D])*"/;var reg11 = new RegExp(‘"(?:\\.|[^"])*"‘);var reg22 = new RegExp(‘"(?:[^"\\]|\\[\d\D])*"‘);var n = 1e6; //100萬次測試test("reg1", reg1);test("reg2", reg2);test("reg11", reg11);test("reg22", reg22);function test(name, re) {console.time(name);for (var i=0; i<n; i++) {str1.match(re);str2.match(re);}console.timeEnd(name);}</script></body></html>
chrome
firefox
IE11
IE8 (我調用了一個外掛程式類比控制台實現IE6-8調試輸出的)
很明顯,第一名是 chrome (以 reg22 那個最佳化過的為準),這個號稱武裝到牙齒的貨,果然夠new逼。
不過 firefox 這貨,竟然連 IE8 都比不過,是不是太慫了點。
最佳化過的 正則 比沒最佳化的快,那是肯定的。
但是 正則字面量 和 new RegExp 比,那就不是一個檔次了。
為什麼有如此大的差距呢?
其實我也沒搞清楚。
以前看到很多文章都說 字面量 會比 new 對象 形式效率高,但是在正則這裡,好像不是這麼回事。
不過也不能直接否認這個觀點,因為我一直都用字面量的,簡潔美觀,用著方便才是王道。
我覺得在資料量大,或者重複操作次數多的時候用 new RegExp 是很必要的。
因為你也看到了效能提升這麼多。
當然前提條件是你的正則必須最佳化,正則沒最佳化的情況,兩種差不多。
所以最佳化你的正則,然後用 new RegExp 可以大幅度提升程式的效能。
PS: IE11 是個特例,這貨從來不安套路出牌。
好了今天的分享完畢,你們都蠢蠢欲動了吧,快去把正則各種new起來吧。