gpt4 book ai didi

rust - 为什么 `regex!` 不是 `Regex::new` 的包装器以提供相同的正则表达式匹配速度?

转载 作者:行者123 更新时间:2023-11-29 07:47:45 25 4
gpt4 key购买 nike

Rust Regex crate提供 regex! 语法扩展,这使得在标准编译时编译正则表达式成为可能。这有两个好处:

  • 我们不需要在运行时做这些工作(更好的程序性能)
  • 如果我们的正则表达式格式错误,编译器可以在编译期间告诉我们,而不是触发运行时 panic

不幸的是,文档说:

WARNING: The regex! compiler plugin is orders of magnitude slower than the normal Regex::new(...) usage. You should not use the compiler plugin unless you have a very special reason for doing so.

这听起来像是用于 regex!Regex::new() 的完全不同的正则表达式引擎。为什么 regex!() 不只是 Regex::new() 的包装器以结合两个世界的优点?据我了解,这些语法扩展编译器插件可以执行任意代码;为什么不是 Regex::new()

最佳答案

答案很微妙:宏的一个特点是regex!的结果可以放入static数据,比如所以:

static r: Regex = regex!("t?rust");

主要问题是 Regex::new() 在正则表达式编译期间使用堆分配。这是有问题的,需要重写 Regex::new() 引擎以允许静态存储。您还可以阅读 burntsushi's comment about this issue on reddit .


有一些关于如何改进 regex! 的建议:

  • 放弃 static 支持,只在编译时验证正则表达式字符串,同时在运行时编译正则表达式
  • 通过使用与 lazy_static! 类似的技巧来保持对 static 的支持

截至 2017 年初,开发人员专注于稳定标准 API 以发布 1.0 版。由于 regex! 无论如何都需要夜间编译器,因此它现在的优先级较低。

但是,编译器插件方法可以提供比 Regex::new() 更好的性能,它已经非常快了:因为正则表达式的 DFA could be compiled into code instead of data ,它有可能运行得更快一些并受益于编译器优化。但 future 必须进行更多研究才能确定。

关于rust - 为什么 `regex!` 不是 `Regex::new` 的包装器以提供相同的正则表达式匹配速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41503880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com