比较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式需要进一步解释自己的令牌。

希望这可以帮助。