国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一次簡單的js正則表達式的性能測試

Eric / 760人閱讀

摘要:最近用到做一些文本處理,免不了涉及正則表達式,由于文本的規(guī)模會達到級,速度和還是很關(guān)鍵的。根據(jù)上的測試發(fā)現(xiàn),如果需要用到正則去匹配的話,還是預編譯的表達式表現(xiàn)最好。看發(fā)現(xiàn)有一個代表也就是嘗試所有可能的匹配。上的相關(guān)解釋如下。

最近用到js做一些文本處理,免不了涉及正則表達式,由于文本的規(guī)模會達到GB級,速度和還是很關(guān)鍵的。

根據(jù) jsperf 上的測試發(fā)現(xiàn),如果需要用到正則去匹配的話,還是預編譯的表達式precompiled search表現(xiàn)最好。這是一個比較容易也比較重要的優(yōu)化項。

看MDN發(fā)現(xiàn)有一個g flag代表global match也就是嘗試所有可能的匹配。MDN上的相關(guān)解釋如下。

  

Whether to test the regular expression against all possible matches in a string, or only against the first.

所有的又產(chǎn)生了一個疑問,如果我這需要判斷是否存在一個表達式,不需要知道幾個,也就是只用RegExp.test(),需不需要g flag,感覺加上有可能會使速度變慢,但是不確定,寫了一個很簡陋的性能測試。

var start = +new Date(),
    end,
    globalRegex = /someone/g,
    nonGlobalRegex = /someone/,
    testStr = "This optimization makes the lexer more than twice as fast! Why does this make sense? First, if you think about it in the simplest way possible, the iteration over rules moved from Python code to C code (the implementation of the re module). Second, its even more than that. In the regex engine, | alternation doesnt simply mean iteration. When the regex is built, all the sub-regexes get combined into a single NFA - some states may be combined, etc. In short, the speedup is not surprising.someone";

for (var i = 100000; i >= 0; i--) {
  // with a g flag
  globalRegex.test(testStr);

  // without g flay
  // nonGlobalRegex.test(testStr);
}
end = +new Date();

console.log(end - start);

分別去掉注釋分別運行發(fā)現(xiàn)帶g flag的需要25-30ms,而不帶g flag的卻需要40+ms,和直覺相反。然后回想了一下g flag的作用,接著看文檔,發(fā)現(xiàn)一個叫做lastIndex的屬性:

  

The lastIndex is a read/write integer property of regular expressions that specifies the index at which to start the next match.

得知既然是嘗試匹配所有可能,如果沒有主動把lastIndex清零,則會繼續(xù)上一次的匹配知道結(jié)束。所以以上代碼如果是帶g flag的情況上一次匹配完成,已經(jīng)到了句末,加入此時console.log(globalRegex.lastIndex)會得到testStr.length,而且下一次會繼續(xù)嘗試向后匹配,并另計返回false。所以可以理解上述的時間差。

假如把for循環(huán)中帶g flag的情況加一句:

for (var i = 100000; i >= 0; i--) {
  // with a g flag
  globalRegex.test(testStr);
  globalRegex.lastIndex = 0;

  // without g flay
  // nonGlobalRegex.test(testStr);
}

兩種情況的運行結(jié)果都在40+ms。

結(jié)論:即使加上g flag理論上也不影響速度,只需要將lastIndex清零,不過清零還是需要消耗的,所以如果只需要匹配判斷,可以不用g flag

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85350.html

相關(guān)文章

  • API

    摘要:是一個極度純凈的上傳插件,通過簡單調(diào)整就可以融入到任何項目,支持多文件上傳上傳速率動態(tài)控制真實進度監(jiān)控分塊生成分塊上傳校驗秒傳暫停取消等。 跨域?qū)W習筆記 前言: 當一個資源,向與之所在服務器不同的域或端口請求另一個資源時,這個HTTP請求,我們認為是跨域的請求。出于安全考慮,瀏覽器會限制腳本發(fā)起的跨域HTTP請求。 那天后端讓我把token放到http請求頭字段里,說是為了和RN端統(tǒng)一...

    lsxiao 評論0 收藏0
  • 【讀書筆記】《高性能JavaScript》

    摘要:性能訪問字面量和局部變量的速度是最快的,訪問數(shù)組和對象成員相對較慢變量標識符解析過程搜索執(zhí)行環(huán)境的作用域鏈,查找同名標識符。建議將全局變量存儲到局部變量,加快讀寫速度。優(yōu)化建議將常用的跨作用域變量存儲到局部變量,然后直接訪問局部變量。 缺陷 這本書是2010年出版的,這本書談性能是有時效性的,現(xiàn)在馬上就2018年了,這幾年前端發(fā)展的速度是飛快的,書里面還有一些內(nèi)容考慮IE6、7、8的東...

    chengjianhua 評論0 收藏0
  • 《高性能javascript》閱讀摘要

    摘要:當執(zhí)行上下文被創(chuàng)建時,它的作用域鏈初始化為當前運行函數(shù)的屬性中的對象。該過程搜索執(zhí)行環(huán)境的作用域鏈,查找同名的標識符。搜索實例成員比從字面量或局部變量中讀取數(shù)據(jù)代價更高,再加上遍歷原型鏈帶來的開銷,這讓性能問題更為嚴重。 最近在閱讀這本Nicholas C.Zakas(javascript高級程序設計作者)寫的最佳實踐、性能優(yōu)化類的書。記錄下主要知識。 加載和執(zhí)行 腳本位置 放在中的...

    duan199226 評論0 收藏0
  • 《高性能javascript》閱讀摘要

    摘要:當執(zhí)行上下文被創(chuàng)建時,它的作用域鏈初始化為當前運行函數(shù)的屬性中的對象。該過程搜索執(zhí)行環(huán)境的作用域鏈,查找同名的標識符。搜索實例成員比從字面量或局部變量中讀取數(shù)據(jù)代價更高,再加上遍歷原型鏈帶來的開銷,這讓性能問題更為嚴重。 最近在閱讀這本Nicholas C.Zakas(javascript高級程序設計作者)寫的最佳實踐、性能優(yōu)化類的書。記錄下主要知識。 加載和執(zhí)行 腳本位置 放在中的...

    afishhhhh 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<