【发布时间】:2023-03-15 07:25:02
【问题描述】:
我想知道这是不是:
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是一个常量并缓存它,这样它就不会每次都重新编译?
【问题讨论】:
-
你可能想举一个例子,而不是 main 方法 -
"some complex regex".r在这两个例子中只会被执行一次,不管任何编译器优化,因为 main 方法只会被调用一次(启动程序)。当然,除非您从程序中调用 main 方法,但这不是阅读示例的人们所期望的。 -
@Cyäegha 感谢您指出这一点,已更正。
-
为了能够做到这一点,编译器必须证明
StringLike.r是纯的,这(在一般情况下)等价于解决停机问题。对于简单的方法,它可能仍然是可能的,但我不知道编译器是否甚至尝试过,考虑到它很可能无论如何都无法证明任何事情。
标签: scala optimization hoisting