scala vs java, performance and memory?[已关闭]
我很想研究Scala,并且有一个我似乎找不到答案的基本问题:一般来说,Scala和Java在性能和内存使用方面是否存在差异?
我很想研究Scala,并且有一个我似乎找不到答案的基本问题:一般来说,Scala和Java在性能和内存使用方面是否存在差异?
Scala使得在没有意识到的情况下使用大量内存变得非常容易。这通常非常强大,但偶尔会很烦人。例如,假设您有一个字符串数组(称为 ),以及从这些字符串到文件的映射(称为 )。假设您要获取映射中长度大于 2 的字符串的所有文件。在Java中,您可以array
mapping
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++] = mapping.get(s);
}
呼!苦功。在Scala中,执行相同操作的最紧凑方法是:
val bigEnough = array.filter(_.length > 2).flatMap(mapping.get)
容易!但是,除非您非常熟悉集合的工作原理,否则您可能没有意识到,这种执行此操作的方式会为数组的每个元素创建一个额外的中间数组(with )和一个额外的对象(with ,这将返回一个选项)。它还创建了两个函数对象(一个用于过滤器,一个用于 flatMap),尽管这很少是一个主要问题,因为函数对象很小。filter
mapping.get
因此,基本上,在原始级别上,内存使用情况是相同的。但是Scala的库有许多强大的方法,可以让你非常轻松地创建大量(通常是短暂的)对象。垃圾回收器通常对这种垃圾很好,但是如果你完全忘记了正在使用的内存,那么在Scala中你可能会比Java更快地遇到麻烦。
请注意,Computer Languages Benchmark Game Scala代码是以类似Java的风格编写的,以获得类似Java的性能,因此具有类似Java的内存使用。你可以在Scala中做到这一点:如果你把你的代码写得像高性能的Java代码,那么它将是高性能的Scala代码。(你可以用一种更惯用的Scala风格来写它,并且仍然能获得良好的性能,但这取决于具体细节。
我应该补充一点,我的Scala代码通常比我的Java代码快,因为在Scala中,我可以用更少的精力完成繁琐的非性能关键部分,并花费更多的精力来优化性能关键部分的算法和代码。
我是新用户,所以我无法在上面的Rex Kerr的答案中添加评论(允许新用户“回答”而不是“评论”是一个非常奇怪的规则)。
我注册只是为了回应“哎呀,Java是如此冗长,如此艰苦的工作”,暗示了Rex上面的流行答案。虽然你当然可以写出更简洁的Scala代码,但给出的Java示例显然是臃肿的。大多数Java开发人员会这样编写代码:
List<String> bigEnough = new ArrayList<String>();
for(String s : array) {
if(s.length() > 2 && mapping.get(s) != null) {
bigEnough.add(mapping.get(s));
}
}
当然,如果我们要假装Eclipse没有为你完成大部分实际的输入,并且保存的每个字符确实使你成为一个更好的程序员,那么你可以编写这个代码:
List b=new ArrayList();
for(String s:array)
if(s.length()>2 && mapping.get(s) != null) b.add(mapping.get(s));
现在,我不仅节省了键入完整变量名称和大括号所花费的时间(使我能够再花5秒钟来思考深入的算法思想),而且我还可以在混淆竞赛中输入我的代码,并可能为假期赚取额外的现金。