比较parsingURL查询时正则expression式和拆分的速度
我想确定什么是节点中的快速parsingURL查询值。 例如, hello.org/post.html?action=newthread&fid=32&fpage=1
fid= hello.org/post.html?action=newthread&fid=32&fpage=1
,如果我想获得fid值,我有3个select:
1 str.match(/[?/&]fid=(.*?)($|[&#])/)
2 req.query.fid
中的req.query.fid
,我发现其实是调用https://github.com/ljharb/qs/blob/master/lib/parse.js
,这是我发现使用str.split('&')
在后面
3 str.split('/[&/#?]/')
,然后使用for
循环来确定哪个是以fid
开头的
我猜第一个是最慢的,第二个是最快的。 但我不知道这是否正确(虽然我可以做一个testing),但是我想知道一些深刻的原因,谢谢。
1)regexp是高级的string操作。 对于parsing过程中遇到的每个字符,它必须与整个正则expression式string中的每个标记匹配。 复杂性是源的长度和正则expression式string的长度的非线性函数。
2)在一个string上进行string标记(分割)时,当你顺序遍历源string时,任务被清除,“切割”并在遇到字符型字符时标记字,并向前移动。 复杂度与n的顺序一样好,其中n是string中的字符数。
3)实际上是(2)的变体,但是在分离器中具有更多的字符。 所以如果第一个字符匹配,还有额外的工作来匹配后续的字符等,所以复杂度增加,并走向正则expression式。 性能仍然比正则expression式好,因为正则expression式需要进一步解释自己的令牌。
希望这可以帮助。