我热衷于研究Scala,有一个基本问题我似乎找不到答案: 一般来说,Scala和Java在性能和内存使用方面有区别吗?

推荐答案

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中,我可以更轻松地完成繁琐的非性能关键部分,并且花费更多的精力来优化性能关键部分的算法和代码.

Java相关问答推荐

摆脱双列举导致的Json解析错误问题

那么比较似乎不是词典学的,尽管doctor 这么说

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

Java .类参数不通过构造函数传递

在springboot 3中,当我调用api endpoint时,会出现404

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

Spring Security不允许加载js

Javadoc在方法摘要中省略方法

Sack()步骤中的合并运算符未按预期工作

在Java 15应用程序中运行Java脚本和Python代码

Java页面筛选器问题

如何在Maven Central上部署?

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?

Bash数组的单引号元素并使用空格连接

Java泛型方法重载

SonarQube在合并升级到java17后对旧代码提出错误