小编典典
Scala使得无需意识到即可轻松使用大量内存。这通常非常强大,但有时可能很烦人。例如,假设您有一个字符串数组(称为array),以及从这些字符串到文件的映射(称为mapping)。假设您要获取地图中所有来自长度大于两个的字符串的文件。在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);
}
ew!辛苦了 在Scala中,执行相同操作的最紧凑的方法是:
val bigEnough = array.filter(_.length > 2).flatMap(mapping.get)
简单!但是,除非你非常熟悉的藏品是如何工作的,你可能不知道的是,这样做会创建一个额外的中间阵列(这种方式filter),和一个额外的对象
数组的每一个元素
(有mapping.get,它返回一个选项)。它还创建了两个函数对象(一个用于过滤器,一个用于flatMap),尽管由于函数对象很小,所以这很少成为主要问题。
因此,基本上,内存使用量在原始级别上是相同的。但是Scala的库具有许多强大的方法,可让您轻松地创建大量(通常是短暂的)对象。垃圾收集器通常可以很好地处理这种垃圾,但是如果您完全不了解正在使用的内存,那么Scala可能会比Java更快地遇到麻烦。
请注意,计算机语言基准游戏Scala代码以类似Java的风格编写,以获得类似Java的性能,因此具有类似Java的内存使用量。您可以在Scala中做到这一点:如果您编写的代码看起来像高性能的Java代码,那么它将是高性能的Scala代码。(您
也许 可以使用更惯用的Scala风格编写它,但仍然可以获得良好的性能,但这取决于具体情况。)
我应该补充一点,每花时间进行编程,我的Scala代码通常比Java代码 更快,
因为在Scala中,我可以花更少的精力完成乏味的非性能关键部分,并花更多的精力优化算法和性能关键部件的代码。
2020-10-18