Rust Regex crate提供了regex!语法扩展,可以在标准编译时编译正则表达式.这有两个好处:

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

不幸的是,doctor 说:

WARNING: regex!编译器插件比Regex::new(...)的正常使用慢几个数量级.除非有非常特殊的原因,否则不应该使用编译器插件.

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

推荐答案

答案非常微妙:宏的一个特点是the result of 100 can be put into static data,就像这样:

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

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


关于如何提高regex!分,有一些建议:

  • 放弃static支持,在编译时仅validate正则表达式字符串,而在运行时仍然compiling正则表达式
  • 使用与lazy_static!类似的技巧保持static支撑

截至2017年初,开发人员的重点是稳定标准API,以发布1.0版.因为regex!需要每晚编译,所以它现在的优先级很低.

然而,编译器插件方法可以提供比Regex::new()更好的性能,后者已经非常快了:自从regex的DFAcould be compiled into code instead of data以来,它有可能运行得更快,并从编译器优化中受益.但future 还需要做更多的研究才能确定.

Rust相关问答推荐

如何仅使用http机箱发送http请求?

无法理解铁 rust &S错误处理

为什么允许我们将可变引用转换为不可变引用?

在铁 rust 中传递所有权

失真图像图形捕获Api

解析程序无法在Cargo 发布中 Select 依赖版本

什么时候使用FuturesOrdered?

返回Result<;(),框<;dyn错误>>;工作

如何将生存期参数添加到框<>;具有dyn类型别名

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

write_buffer 不写入缓冲区而是输出零 WGPU

Sized问题的动态调度迭代器Rust

Rust 程序中的内存泄漏

Rust 函数指针似乎被borrow 判断器视为有状态的

n 个范围的笛卡尔积

为什么我可以同时传递可变和不可变引用?

在 Rust 中如何将值推送到枚举 struct 内的 vec?

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用