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

时间:2012-10-27 15:06:07

标签: scala jvm

考虑这个scala代码

val word = str.toLowerCase
val chars = word.distinct.sorted

然后再

//chars.map(c => str.toLowerCase.count(_ == c))
chars.map(c => word.count(_ == c))

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

1 个答案:

答案 0 :(得分:7)

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