gpt4 book ai didi

scala - Scala 编译器会提升正则表达式吗

转载 作者:行者123 更新时间:2023-12-03 15:59:20 25 4
gpt4 key购买 nike

我想知道这是否:

object Foo {
val regex = "some complex regex".r
def foo() {
// use regex
}
}

和这个:
object Foo {
def foo() {
val regex = "some complex regex".r
// use regex
}
}

会有任何性能差异。即,Scala 编译器会识别 "some complex regex".r是一个常量并缓存它,这样它就不会每次都重新编译?

最佳答案

它会在运行时有所不同。第一个示例中的表达式将只计算一次。表达从秒开始 - 每次你打电话 Foo.foo() .这里的计算意味着将隐式添加的函数“r”(来自 scala-library)应用于字符串:

scala> ".*".r
res40: scala.util.matching.Regex = .*

该函数实际上每次调用时都会编译正则表达式(无缓存)。

顺便说一句,任何在运行时对正则表达式的幼稚缓存都容易受到 OutOfMemory 的攻击。 - 但是,我相信可以通过 WeakHashMap 安全地实现它,但当前 Java 的 Pattern实现(这是scala的基础 Regex ) doesn't实际实现它,可能是因为这样的实现可能不会对性能产生可预测的影响(GC 每次运行时可能必须删除大部分缓存值)。带有驱逐的缓存更可预测,但仍然不是那么简单的方法(谁会为它选择超时/大小?)。谈到 scala 方式,一些智能宏可以在编译时进行优化(仅对基于“字符串常量”的正则表达式进行缓存),但默认情况下:

Scala 编译器也没有对 regexp 进行任何优化,因为 regexp 不是 Scala 语言的一部分。

所以最好将静态的 "".r 结构移出函数。

关于scala - Scala 编译器会提升正则表达式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26055409/

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