加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:54:56 所属栏目:安全 来源:网络整理
导读:我想知道这是否: 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编译器会认识到“某些复杂的正
我想知道这是否:

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编译器会认识到“某些复杂的正则表达式”.r是一个常量并对其进行缓存,以便它不会每次都重新编译?

解决方法

它在运行时会有所不同.第一个例子的表达式只计算一次.从第二个表达 – 每次调用Foo.foo().这里的计算意味着将隐式添加的函数“r”(来自scala-library)应用于字符串:

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

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

顺便说一句,在运行时任何天真的regexp缓存容易受到OutOfMemory的影响 – 但是,我相信可以使用WeakHashMap安全地实现它,但是当前Java的Pattern实现(scala的正则表达式的基础)doesn’t实际上实现了它,可能是因为这样的实现可能对性能没有可预测的影响(GC可能必须在每次运行时删除大多数缓存值).带有驱逐的缓存更容易预测,但仍然不是那么简单(谁会为它选择超时/大小?).谈到scala-way,一些智能宏可以在编译时进行优化(仅针对’基于字符串常量’的regexp进行缓存),但默认情况下:

Scala编译器也没有关于regexp的任何优化,因为regexp不是scala语言的一部分.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读