Php PCRE_UTF8修改器速度极慢

Php PCRE_UTF8修改器速度极慢,php,regex,utf-8,pcre,Php,Regex,Utf 8,Pcre,出于某种原因,只需将PCRE_UTF8修饰符添加到regex输入中,即使不使用多字节字符,执行时间也会增加大约十倍(x10)。我不明白为什么会这样,以及如何最好地缩短时间。用于测试的脚本是: $s = microtime(true); for ($i = 0; $i < 1000; $i++) { preg_match('/ /u', str_repeat(' ', 50000), $match); } $e = microtime(true); echo "u Modifier:

出于某种原因,只需将PCRE_UTF8修饰符添加到regex输入中,即使不使用多字节字符,执行时间也会增加大约十倍(x10)。我不明白为什么会这样,以及如何最好地缩短时间。用于测试的脚本是:

$s = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    preg_match('/ /u', str_repeat(' ', 50000), $match);
}
$e = microtime(true);
echo "u Modifier:\t".(($e-$s)/$i)."\n";
$s = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    preg_match('/ /', str_repeat(' ', 50000), $match);
}
$e = microtime(true);
echo "No Modifier:\t".(($e-$s)/$i)."\n";
我试着看看这是否是一个已知的在线bug,但是

这是由什么引起的?要更快地执行match1,最好的方法是什么



1“比赛”指任何比赛。所使用的示例只是一个简单的示例,显然可以以更好的方式进行匹配。

PCRE在进行任何其他处理之前检查UTF的有效性

从:

当设置了
PCRE2_UTF
选项时,作为模式和主题传递的字符串(默认情况下)在输入相关函数时检查其有效性。如果传递了无效的UTF字符串,则返回一个负错误代码。通过调用
pcre2\u get\u startchar()
,可以从匹配数据块中提取有问题字符的代码单位偏移量,这在UTF错误后用于此目的

在进行任何其他处理之前,将检查整个字符串。除了检查字符串的格式外,还将进行一项检查,以确保所有代码点位于U+0到U+10FFFF范围内,不包括代理区域。所谓的“非字符”代码点并没有被排除在外,因为Unicode勘误表9明确指出它们不应该被排除在外

在某些情况下,您可能已经知道您的字符串是有效的,因此希望跳过这些检查以提高性能,例如在重复扫描长主题字符串的情况下。如果您在编译时或匹配时设置了PCRE2\u NO\u UTF\u CHECK选项
,则PCRE2会假定给定的模式或主题(分别)仅包含有效的UTF代码单元序列

(注:这些文件引用自PCRE2,但PCRE行为相同)

不幸的是,我认为没有办法从PHP设置
PCRE2\u NO\u UTF\u CHECK
选项


无论如何,您的基准测试应该经过更多的迭代才有意义。您应该测量几秒钟的计算时间,以更好地了解此功能的影响。

匹配utf-8字符比字节慢。我想,但空格不是多字节的,所以理论上,它不应该大致相同吗?我只是不明白为什么在这种情况下会有如此重大的打击。PCRE怎么知道只有空格?你说它是UTF-8,它认为它是UTF-8,这很公平。这看起来很奇怪,它需要10倍的时间。这听起来是对的。检查整个字符串似乎正是产生如此巨大差异的原因。