Perl 的解释器是用 C 编写的,但与 C 相比,perl 的字符串匹配速度更快。如果我错了,有人可以纠正我。如果这是事实可以解释吗?
2 回答
Perl 确实是用 C 编写的(我想也是用 Perl 编写的)。
C 没有字符串匹配能力,所以它不可能比 Perl 慢(或快)。当然,您可以在 C 中编写一个字符串匹配库并将其与 Perl 中的字符串匹配进行比较,但是您无法比较 C,因为 C 没有。
demerphq(Perl 的正则表达式引擎专家之一)最近回复了“P5 RE 与其他语言的其他 RE 相比的速度(我不会定义)是多少?” 具有以下内容:
这是一个棘手的问题。我的一般经验是,某些正则表达式引擎对某些模式的匹配速度更快,但许多正则表达式引擎无法匹配得更慢,通常慢得多,并且实际上 perls 引擎具有竞争力或优于许多其他引擎。所以你必须非常小心这方面的基准测试,很多人只看成功案例,Perl 通常比较慢。这是一个经过深思熟虑的设计决定,在许多情况下,模式匹配失败的次数多于匹配的次数,通常我们会尝试快速失败。
使这种比较变得棘手的另一个主题是 Perls 正则表达式引擎具有非常丰富的功能集,而其他引擎经常以功能换取性能。Perls 正则表达式引擎具有非常好的 unicode 支持,您经常会发现其他引擎不支持这种支持(通常这是尽管他们声称。)
这种东西的一个例子是 Perl 使用的“强制子串”逻辑。引擎将在模式中找到最长的字符串,该字符串必须存在才能使模式匹配。然后我们使用 Fast-Boyer-Moore (FBM) 匹配来确定字符串是否存在。如果没有,那么我们永远不会启动正则表达式引擎。这意味着理论上 Perl 可以比真正的 DFA 更快地拒绝一个模式,而且实际上它经常这样做。DFA 通常需要对长度为 N 的字符串执行 N 次操作,FBM 可以进行最佳情况 N/L 检查,其中 N 是字符数,L 是强制字符串的长度。
Perl 的字符串匹配代码不必使用 C 的(少数)字符串处理库函数。因此它不受C库实现者算法选择的限制,它可以做出自己的决定。
我想我的答案是 Perl 的字符串匹配没有理由不应该比给定的 C 实现更快,只是因为 Perl 是用 C 实现的。我不知道它是否真的更快。