C++ 与其他跨平台regexp库相比,Oniguruma有多好?
我们正试图摆脱boost::regex,它的性能非常糟糕。 根据benchmark,总体上是最好的 我们有多个regexp(并且总是不断变化),我们将其应用于从中等(100个字符)到巨大(1k个字符)的字符串。。。所以这是一个非常异质的环境 你们中有人成功地使用过它吗?您是否建议使用更“标准”的PCRE或RE2C++ 与其他跨平台regexp库相比,Oniguruma有多好?,c++,c,regex,performance,cross-platform,C++,C,Regex,Performance,Cross Platform,我们正试图摆脱boost::regex,它的性能非常糟糕。 根据benchmark,总体上是最好的 我们有多个regexp(并且总是不断变化),我们将其应用于从中等(100个字符)到巨大(1k个字符)的字符串。。。所以这是一个非常异质的环境 你们中有人成功地使用过它吗?您是否建议使用更“标准”的PCRE或RE2 谢谢 这两种实现(FSA和BT)具有完全不同的行为,您可以在右侧栏(电子邮件)中看到 oniguruma通常速度很快,但如果您使用某个特定的regexp“运气不好”,则可能运行缓慢。这是
谢谢 这两种实现(FSA和BT)具有完全不同的行为,您可以在右侧栏(电子邮件)中看到 oniguruma通常速度很快,但如果您使用某个特定的regexp“运气不好”,则可能运行缓慢。这是因为它是一种回溯算法 相比之下,虽然re2通常稍慢一些,但它没有同样的风险——它的时间永远不会以同样的方式爆炸(它没有最坏情况下的指数行为) 所以这取决于细节。如果您确信您的regexp将是安全的,或者愿意检测并中止慢速匹配,oniguruma是有意义的。但就我个人而言,我倾向于为re2的安全性多付一点(不是更多) 有关这方面的更多信息,请参见(re2作者)
[*]好吧,也许永远都不会太坚强。对于某些regexp,我认为在某些情况下,它必须采用BT方法(可能涉及匹配以前的匹配和前瞻)。但是在大多数正则表达式上它仍然更安全。我已经用以下库做了一个基准测试:
- 促进
- re2
- 大牛沼
- 升压:98840毫秒
- re2:51197毫秒
- Oniguruma:16095毫秒
- re2(无CAPUTRE*见下文)):16162 ms
^((?:https?:/)?(?:[a-z0-9\-]{1,63})+(?:[a-z0-9\-]{1,63}))(?:[^\?]*).$
以下是每个LIB的结果:
- 升压:140毫秒
- re2:5663毫秒
- Oniguruma:53毫秒
- re2(无捕获):37毫秒
但是,如果您不需要捕获组,那么re2是一个更好的选择,因为我发现它的API更易于使用。评测、评测、评测。。。如果是任务关键型的,您应该花时间测试不同的库,以找到最适合您的库,当然,在评测的同时。我们一直在做这件事,我将尝试在这里发布基准测试的结果。您是否重用了相同的正则表达式(即使用某种形式的正则表达式预编译)?还有,你有到基准的链接吗?嘿,对不起,这是两年前,我没有用于基准的文件了(或者更确切地说,我不知道它们在哪里^^)。我应该更好地记录这一点,因为我想你使用图书馆的方式会对性能产生巨大影响。。下次会做得更好!感谢您的更新-这有点遥不可及:-)