scala vs java,性能和内存?

新手上路,请多包涵

我很想研究 Scala,但有一个基本问题似乎找不到答案:一般来说,Scala 和 Java 在性能和内存使用方面是否存在差异?

原文由 JohnSmith 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 754
2 个回答

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++] = mapping.get(s);
}

哇!努力工作。在 Scala 中,做同样事情的最简洁的方法是:

 val bigEnough = array.filter(_.length > 2).flatMap(mapping.get)

简单的!但是,除非您非常熟悉集合的工作原理,否则您可能没有意识到这种方法会创建一个额外的中间数组(使用 filter ),以及为 每个元素 创建一个额外的对象 _数组_(带有 mapping.get ,返回一个选项)。它还创建了两个函数对象(一个用于过滤器,一个用于 flatMap),尽管这很少是一个主要问题,因为函数对象很小。

所以基本上,内存使用在原始级别上是相同的。但是 Scala 的库有许多强大的方法,可以让您非常轻松地创建大量(通常是短暂的)对象。垃圾收集器通常很擅长处理这种垃圾,但如果您完全不知道正在使用的是什么内存,那么在 Scala 中您可能会比在 Java 中更早遇到麻烦。

请注意,Computer Languages Benchmark Game Scala 代码是以一种类似 Java 的风格编写的,以便获得类似 Java 的性能,因此具有类似 Java 的内存使用。您可以在 Scala 中做到这一点:如果您编写的代码看起来像高性能 Java 代码,那么它就是高性能的 Scala 代码。 (您 可能 能够以更惯用的 Scala 风格编写它并仍然获得良好的性能,但这取决于具体情况。)

我应该补充一点,根据花费在编程上的时间,我的 Scala 代码通常比我的 Java 代码 _更快_,因为在 Scala 中我可以用更少的精力完成乏味的非性能关键部分,并将更多的注意力花在优化算法和性能关键部分的代码。

原文由 Rex Kerr 发布,翻译遵循 CC BY-SA 4.0 许可协议

我是新用户,所以我无法对 Rex Kerr 上面的回答添加评论(顺便说一句,允许新用户“回答”而不是“评论”是一个非常奇怪的规则)。

我注册只是为了回应 Rex 在上面的流行回答中暗示的“哇,Java 是如此冗长和如此艰苦的工作”。虽然您当然可以编写更简洁的 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 秒来思考深入的算法思想),而且我还可以在混淆竞赛中输入我的代码,并有可能赚取额外的现金假期。

原文由 Not Sleeping 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题