Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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
Java regexp或太慢_Java_Regex_Performance - Fatal编程技术网

Java regexp或太慢

Java regexp或太慢,java,regex,performance,Java,Regex,Performance,为什么是模式 [0123]123456|98765 在Java中,执行速度是执行[0123]123456然后执行98765的两倍吗?因此,单独搜索它们比使用或执行更快。有人有解释吗 UPD 有关测试示例和结果,请参见: UPD2 我发现原因在java.util.regex中。以下测试表明: 所以,正如您所看到的,Matcher对源字符序列发出的请求要多得多。因此,第一种模式比两种不同的模式需要2倍多的请求来源代码 多行和不区分大小写是不相关的。或运算符影响复杂性 好的。看来我找到了一半答案

为什么是模式

[0123]123456|98765
在Java中,执行速度是执行[0123]123456然后执行98765的两倍吗?因此,单独搜索它们比使用或执行更快。有人有解释吗

UPD

有关测试示例和结果,请参见:

UPD2

我发现原因在java.util.regex中。以下测试表明:

所以,正如您所看到的,Matcher对源字符序列发出的请求要多得多。因此,第一种模式比两种不同的模式需要2倍多的请求来源代码


多行和不区分大小写是不相关的。或运算符影响复杂性

好的。看来我找到了一半答案

当我们只有像123456这样的模式时,regexp引擎使用Boyer-Moore字符串匹配算法。但如果你有或,它就不使用它,只是简单地比较每个字符

由于Boyer-Moore算法的本质,它可能更有效,所以这就是第二种方法更快的原因


例如,如果我有输入字符串“11223344”和模式“123456”,那么根据Boyer Moore实现,应该检查的唯一字符是第5位的“3”。这比针对每个字符测试模式要有效得多。

这就是您的确切模式吗?您是如何测试它的?对于在字符串中搜索匹配项的用例,确实存在差异(但在我的计算机上,它的速度不会慢两倍)。关于ideone:我的测试看起来像是由NHAHDH提供的。我的结果表明,第一种模式大约慢2-3倍。在我自己的测试中,平均时间是2700毫秒对950毫秒。你的比较可能不公平。您使用
多行
不区分大小写
标志编译模式;对于
测试中的第二个模式,您没有这样做。我不确定这会对性能产生什么影响-你能试试吗?@TimPietzcker:我用他生成输入的方式(一个字符串约34mil个字符,我将他的循环从14M减少到5M)代替了我自己的
generateInput
(随机字符串,长度为10-90个字符)。对于这样的输入,我的系统上的差异是2倍。