Scala使得在没有意识到的情况下使用大量内存变得非常容易.这通常非常强大,但偶尔也会很烦人.例如,假设您有一个字符串数组(称为array
),以及从这些字符串到文件的映射(称为mapping
).假设您想要获取映射中的所有文件,这些文件来自长度大于2的字符串.在Java中,您可以
int n = 0;
for (String s: array) {
if (s.length > 2 && mapping.containsKey(s)) n++;
}
String[] bigEnough = new String[n];
n = 0;
for (String s: array) {
if (s.length <= 2) continue;
bigEnough[n++] = map.get(s);
}
唷!艰苦的工作.在Scala中,做同样事情的最简洁方式是:
val bigEnough = array.filter(_.length > 2).flatMap(mapping.get)
容易的但是,除非您非常熟悉集合的工作方式,否则您可能没有意识到,这种方法创建了一个额外的中间数组(带filter
)和一个额外的对象(带mapping.get
,返回一个选项).它还创建了两个函数对象(一个用于过滤器,一个用于平面贴图),尽管这很少是一个主要问题,因为函数对象很小.
所以基本上,内存使用量在原始水平上是相同的.但是Scala的库有很多强大的方法,可以让你很容易地创建大量(通常是短暂的)对象.垃圾收集器通常可以很好地处理这种垃圾,但是如果你完全不知道正在使用什么内存,那么在Scala中你可能会比在Java中更快地遇到麻烦.
请注意,计算机语言基准游戏Scala代码是以类似Java的风格编写的,目的是获得类似Java的性能,因此具有类似Java的内存使用.您可以在Scala中实现这一点:如果您编写的代码看起来像高性能Java代码,那么它将是高性能Scala代码.(你可以用更惯用的Scala风格编写它,但仍然可以获得良好的性能,但这取决于具体情况.)
我应该补充一点,每花在编程上的时间,我的Scala代码通常比我的Java代码高出faster,因为在Scala中,我可以更轻松地完成繁琐的非性能关键部分,并且花费更多的精力来优化性能关键部分的算法和代码.