优化对不可变对象的冗余调用

Luk*_*don 2 jvm scala

考虑这个scala代码

val word = str.toLowerCase
val chars = word.distinct.sorted
Run Code Online (Sandbox Code Playgroud)

然后是

//chars.map(c => str.toLowerCase.count(_ == c))
chars.map(c => word.count(_ == c))
Run Code Online (Sandbox Code Playgroud)

我创建了val word以避免为map创建一个新的小写字符串.但是,从理论上讲,Scala编译器可以优化它吗?它知道字符串是不可变的.

Kim*_*bel 7

如果编译器以某种方式知道.toLowerCase总是返回相同的结果并且没有任何副作用,那么它可以优化.toLowerCase对同一对象的几次调用以仅调用一次.然而,它无法知道,在你的例子中,它甚至都不是真的.例如,根据使用的默认语言环境,"I".toLowerCase可能是"i""?".由于默认语言环境可以在调用之间切换,因此这种优化无效.