淺談 js 正則字面量 與 new RegExp 執行效率

來源:互聯網
上載者:User

標籤: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起來吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.