当前位置: 首页 > 面试题库 >

Scala vs Java,性能和内存?

韦睿
2023-03-14
问题内容

我热衷于研究Scala,并提出了一个似乎无法找到答案的基本问题:一般来说,Scala和Java在性能和内存使用方面是否有所不同?


问题答案:

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中,我可以花更少的精力完成乏味的非性能关键部分,并花更多的精力优化算法和性能关键部件的代码。



 类似资料:
  • 由于事件处理程序可以为现代Web 应用程序提供交互能力,因此许多开发人员会不分青红皂白地向页面中添加大量的处理程序。在创建GUI 的语言(如C#)中,为GUI 中的每个按钮添加一个onclick事件处理程序是司空见惯的事,而且这样做也不会导致什么问题。可是在JavaScript 中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能。导致这一问题的原因是多方面的。首先,每个函数都是对象,

  • valgrind一个很好用的内存和CPU分析工具,srs由于使用了st(state-threads),st是基于c函数setjmp和longjmp,valgrind不支持这两个函数,所以srs没法用valgrind分析内存错误和泄漏。 gperf是google用作内存和CPU分析的工具,基于tcmalloc(也是google内存分配库,替换glibc的malloc和free)。好消息是gperf可

  • 事件 事件:用户与浏览器特定的交互瞬间。 内存和性能 事件处理程序为现代web浏览器提供了交互能力,但有时也不能一味地为页面添加事件处理程序,在JavaScript中,添加到页面中的事件处理程序的数量直接影响着页面整体的运行性能。添加到页面中的事件处理程序越多,那么所占用的内存也多,运行性能就会下降。而且事先指定事件处理程序面导致的DOM访问次数也会增多。对于如何利用好事件处理程序对页面运行性能的

  • 本文向大家介绍JavaScript 事件对内存和性能的影响,包括了JavaScript 事件对内存和性能的影响的使用技巧和注意事项,需要的朋友参考一下 虽说事件处理程序可以为现代 Web 页面添加很强的交互能力,但是不分青红皂白就添加大量的事件处理程序绝对是一种愚蠢的行为。 我们来分析一下:事件处理程序本质上是一种函数,是一种对象,存放在内存中,设置大量的事件处理程序会使内存中的对象变多,Web

  • 问题内容: 请执行以下操作: 与以下内容相比对性能有任何影响: 问题答案: 从文档的 性能: 用样式对象制作样式表可以通过ID引用它,而不必每次都创建一个新的样式对象。 它还仅允许通过桥发送一次样式。所有后续使用都将引用一个ID(尚未实现)。 另一个好处是样式错误将在编译时而不是运行时生成。 我个人仍然喜欢使用内联样式(并为共享样式创建新的组件),因为它使代码对我而言更具可读性,并且对性能的影响并

  • 问题内容: 我经常听到与访问线程之间的进程内存相比,访问进程之间的共享内存段不会降低性能。换句话说,多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题)。 但我有疑问: 1)shmat()将本地进程虚拟内存映射到共享段。必须为每个共享内存地址执行此转换,并且转换可能会花费大量成本。在多线程应用程序中,不需要额外的转换:所有VM地址都转换为物理地址,就像在不访问共享内存的常规过