考虑这个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
以避免为 map 创建新的小写字符串。但是,理论上,Scala 编译器可以优化掉它吗?它知道字符串是不可变的。
最佳答案
如果编译器以某种方式知道 .toLowerCase
总是返回相同的结果并且没有任何副作用,它可以优化对同一对象的 .toLowerCase
的多次调用只需一个电话。但是,它不知道这一点,在你的例子中它甚至不是真的。例如,根据使用的默认语言环境,"I".toLowerCase
可能是 "i"
或 "ı"
。由于默认语言环境可以在调用之间更改,因此这种优化是无效的。
关于scala - 优化对不可变对象(immutable对象)的冗余调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101332/