【发布时间】:2022-01-04 18:22:15
【问题描述】:
This Github repository 将 std::regex 添加到正则表达式引擎列表并被其他引擎淘汰。
为什么在 libstdc++ 中实现的 std::regex 比其他的慢得多?这是因为 C++ 标准要求,还是只是特定的实现没有得到很好的优化?
同样在枪战中,std::regex 无法编译所有其他人都接受的几个正则表达式,即使在添加标志 std::regex::extended 之后也是如此。他们是(?i)Twain、\b\w+nn\b、(?i)Tom|Sawyer|Huckleberry|Finn、\s[a-zA-Z]{0,12}ing\s、([A-Za-z]awyer|[A-Za-z]inn)\s和\p{Sm}。
更新:添加了与 boost::regex 的比较。
UPDATE2:添加了 ctre
【问题讨论】:
-
很可能是由于标准实现和/或粗心对每个目标架构的通用性和支持。尝试升级您的编译器或工具链可能会看到改进。
-
假设
std::regex没有性能要求。std::regex的要求更多的是正确操作而不是速度。 -
任何带有 (?i) 的东西都会失败,因为它不是扩展 posix 语法的一部分。我不确定{Sm}。您应该查看在构造正则表达式对象期间引发的异常,它可以为您提供更多信息。
-
std::regex没有性能要求,所以一切正常。如果您想要稳定的性能,请使用 pcre2 之类的东西。 -
另一种可能性是它针对其他用例进行了优化。您可以使用 DFA 或 NFA 解析正则表达式,构建 DFA 需要更多时间,但是使用 DFA 可以显着加快正则表达式的解析速度。您应该尝试将这种特殊情况作为附加测试用例。
标签: c++ regex benchmarking libstdc++ re2