Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与其他跨平台regexp库相比,Oniguruma有多好?_C++_C_Regex_Performance_Cross Platform - Fatal编程技术网

C++ 与其他跨平台regexp库相比,Oniguruma有多好?

C++ 与其他跨平台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“运气不好”,则可能运行缓慢。这是

我们正试图摆脱boost::regex,它的性能非常糟糕。 根据benchmark,总体上是最好的

我们有多个regexp(并且总是不断变化),我们将其应用于从中等(100个字符)到巨大(1k个字符)的字符串。。。所以这是一个非常异质的环境

你们中有人成功地使用过它吗?您是否建议使用更“标准”的PCRE或RE2


谢谢

这两种实现(FSA和BT)具有完全不同的行为,您可以在右侧栏(电子邮件)中看到

oniguruma通常速度很快,但如果您使用某个特定的regexp“运气不好”,则可能运行缓慢。这是因为它是一种回溯算法

相比之下,虽然re2通常稍慢一些,但它没有同样的风险——它的时间永远不会以同样的方式爆炸(它没有最坏情况下的指数行为)

所以这取决于细节。如果您确信您的regexp将是安全的,或者愿意检测并中止慢速匹配,oniguruma是有意义的。但就我个人而言,我倾向于为re2的安全性多付一点(不是更多)

有关这方面的更多信息,请参见(re2作者)


[*]好吧,也许永远都不会太坚强。对于某些regexp,我认为在某些情况下,它必须采用BT方法(可能涉及匹配以前的匹配和前瞻)。但是在大多数正则表达式上它仍然更安全。

我已经用以下库做了一个基准测试:

  • 促进
  • re2
  • 大牛沼
基准测试包括执行一系列测试,这些测试在非常异构的regexp上大量使用regexp(分组、非分组、长regexp(484个字符)、短regexp、管道、\?、*,,等等)。应用于从几个字符到大约8k字符的文本

每次计算regexp匹配时,我都会存储regexp并增加一个毫秒计数器,以累积计算regexp所花费的时间(称为多次)

以下是每个库在所有regexp上花费的总时间:

  • 升压:98840毫秒
  • re2:51197毫秒
  • Oniguruma:16095毫秒
  • re2(无CAPUTRE*见下文)):16162 ms
*我们(几乎)总是想在regexp中捕获组的内容,而re2在捕获组()时执行的非常糟糕。您在上面的结果中看不到太多,因为当无法捕获组时,它会表现良好。例如,在这个regexp上(执行了很多次):

^((?:https?:/)?(?:[a-z0-9\-]{1,63})+(?:[a-z0-9\-]{1,63}))(?:[^\?]*).$

以下是每个LIB的结果:

  • 升压:140毫秒
  • re2:5663毫秒
  • Oniguruma:53毫秒
  • re2(无捕获):37毫秒
见re2从5663 ms下降到37 ms

tl;博士 所以我的结论是,对于我们的使用,Oniguruma显然是优越的


但是,如果您不需要捕获组,那么re2是一个更好的选择,因为我发现它的API更易于使用。

评测、评测、评测。。。如果是任务关键型的,您应该花时间测试不同的库,以找到最适合您的库,当然,在评测的同时。我们一直在做这件事,我将尝试在这里发布基准测试的结果。您是否重用了相同的正则表达式(即使用某种形式的正则表达式预编译)?还有,你有到基准的链接吗?嘿,对不起,这是两年前,我没有用于基准的文件了(或者更确切地说,我不知道它们在哪里^^)。我应该更好地记录这一点,因为我想你使用图书馆的方式会对性能产生巨大影响。。下次会做得更好!感谢您的更新-这有点遥不可及:-)