gpt4 book ai didi

regex - 解析许多小字符串或单个大字符串 - 哪个更快?

转载 作者:行者123 更新时间:2023-12-04 13:50:26 25 4
gpt4 key购买 nike

在需要用正则表达式解析大量字符串的场景下,考虑到所有的测试都使用同一个RegEx针,这样会更快:

  1. 单独测试数组中的每个字符串,或者;
  2. 要将所有内容连接成一个大字符串并只测试一次?

我相信数字 2 最好,而不必多次启动 RegEx 引擎来处理字符串数组。然而,在 PHP (PCRE) 中进行了一些测试后,这似乎是不正确的。

基准


我在 PHP 5.3 中做了一个简单的基准测试 (source code)得到如下结果:

122185 interactions in 5 seconds testing multiple smaller strings inside an array

26853 interactions in 5 seconds doing the single big-string test

因此,我必须得出结论,第一种方法最多快 5 倍。但是,我想要求一个权威的答案来证实这一点;由于一些我不知道的 PHP 优化,我可能会错误地假设事情。

在使用正则表达式测试大字符串之前将其分段是否总是一个更优化的解决方案,而不是专门在 PCRE 中?

preg_grep()

我认为这里不应该考虑这个功能。这是一个基准测试,而不是优化问题。更不用说该函数是特定于 PHP 的方法。此外,preg_match_all 返回所有匹配的子字符串,而 preg_grep 仅指示匹配的数组元素。

最佳答案

您的基准测试有缺陷。看看你的这段代码:

while(time() - $TimeStart < 5)
for($i = 0; $i < $Length; $i++, $Iterations++)
{
preg_match_all($RegEx, $Input[$i], $m);
}
}

$Iterations 应该while 中增加,而不是在for 中增加。将前一个结果除以:

24437 iterations using array
26853 iterations using big string

您不应该使用 time() 进行时间测量,microtime() 更适合获得准确性。

最后,这个基准测试并不完整,因为要获得两个测试的相同结果,数组方法需要在每次迭代后执行 array_merge()。此外,某个地方需要将一个大字符串转换为一个数组,这也需要时间。

关于regex - 解析许多小字符串或单个大字符串 - 哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com