为什么 PCRE 正则表达式比 C++11 正则表达式快得多

2024-05-08

一些示例代码。这是使用 cregex_iterator 的 c++11 部分:

std::chrono::steady_clock::time_point begin0 = std::chrono::steady_clock::now();
regex re("<option[\\s]value[\\s]*=[\\s]*\"([^\">]*)\"[\\s]*[^>]*>", regex::icase);
int found = 0;
for (std::cregex_iterator i = std::cregex_iterator(input, input + input_length, re);
i != std::cregex_iterator();
    ++i)
{
    found++;
    if (found < 10000) continue;
    break;
}
std::chrono::steady_clock::time_point end0 = std::chrono::steady_clock::now();

这是PCR部分。正则表达式都是一样的。

std::chrono::steady_clock::time_point begin4 = std::chrono::steady_clock::now();
const char *pError = NULL;
int errOffset;
int options = PCRE_MULTILINE | PCRE_CASELESS;
const char* regexp = "<option[\\s]value[\\s]*=[\\s]*\"([^\">]*)\"[\\s]*[^>]*>";
pcre* pPcre = pcre_compile(regexp, options, &pError, &errOffset, 0);                
int offset = 0;
int matches = -1;
int pMatches[6];
while (offset < input_length)
{
    matches = pcre_exec(pPcre,NULL, input, input_length, offset,0, pMatches,6); 
    if (matches >= 1)
    {
        found++;
        offset = pMatches[1];
        if (found < 10000) continue;
        break;  // find match
    }
    else
        offset = input_length;
}

std::chrono::steady_clock::time_point end4 = std::chrono::steady_clock::now();

结果表明 PCRE 比 C++11 快 100 倍。我在 c++11 实现中发现了一些向量复制和调整大小。还有其他原因吗?


PCRE 受益于一些称为启动优化默认情况下配置为启用。这些优化包括:

  1. 对未锚定模式进行主题预扫描(如果starting点是 找不到引擎甚至懒得进行匹配 过程。)
  2. 研究模式以确保主题的最小长度不短于模式本身
  3. 自动占有
  4. 快速故障(如果specific点是 找不到引擎甚至懒得进行匹配 过程。)

表面形态分析:

<option             # Subject pre-scan applied (unachored pattern)
    [\\s]
    value
    [\\s]*          # Auto-possessification applied (translates to \s*+)
    =
    [\\s]*          # //
    \"([^\">]*)\"   
    [\\s]*          # //
    [^>]*
>                   # Min length (17 chars) check of subject string applied

此外,如果输入字符串没有特殊字符,例如>,应该抛出快速失败。您应该知道性能也很大程度上取决于输入字符串。

运行以下模式:

(*NO_AUTO_POSSESS)(*NO_START_OPT)<option[\s]value[\s]*=[\s]*\"([^\">]*)\"[\s]*[^>]*>

在此输入字符串上(观察该时期):

<option value                                                                 .

并比较结果(现场演示 https://www.regex101.com/r/Eiwvpw/1).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 PCRE 正则表达式比 C++11 正则表达式快得多 的相关文章

随机推荐