与 Java 或其他非函数式语言相比,Scala 究竟如何利用更多内核?
Posted
技术标签:
【中文标题】与 Java 或其他非函数式语言相比,Scala 究竟如何利用更多内核?【英文标题】:How exactly does Scala leverage more cores as opposed to Java or other non-functional languages? 【发布时间】:2019-02-02 05:55:41 【问题描述】:我最近在听 Martin Odersky 的视频,他试图解释函数式语言(例如 Scala,但当然不一定 Scala)相对于 OOP 或过程语言的基本优势。 p>
套用一句话,他解释说 Moore's Law 最近让我们失望了,因此为了让处理器“更快”,而不是能够使内核中的晶体管数量翻倍,CPU 制造商只是提供更多内核。这反过来又使并发/多线程应用程序可以更充分地利用 CPU。因此,主要的收获是:应用程序的并发性越高,其代码在不同内核上同时运行的 sn-ps 越多,CPU 上的内核越多,程序执行的总体速度就越快。
到目前为止,一切都很好。
他未能解释的(或者更可能是我未能理解的)是为什么像 Scala 这样的函数式语言比其他非函数式语言更具有并发性。由于我们碰巧在谈论 JVM 空间,让我们快速比较一下 Java 和 Scala。一个 Scala 程序是怎么回事,如果它是用纯 Java 实现的,将会使并行化/并发变得更加困难,特别是如果它全部编译为 JVM 字节码并在相同的 JVM 上运行原生功能??
意思是我有两个 JVM 应用程序,App1 用 Java 编写,App2 用 Scala 编写。他们都执行完全相同的任务并完成相同的事情。两者都被编译为 JVM 字节码,并在安装了相同 JVM 的同一台计算机上运行。 Scala 应用程序如何能够“利用”JVM 功能,使其比 Java 应用程序更适合并发(因此,在具有更多内核的 CPU 上更快)?
【问题讨论】:
它没有“利用更多的核心”,从运行时的角度来看也不是“更多的并发”。在 Scala 中编写并发应用程序比在 Java 中更容易,因为函数式方法需要更少的经验和工作来获得相同的结果(事实上,由于不变性开销,Scala 可能会更慢)。 【参考方案1】:当您说您的两个应用程序最终归结为 JVM 上的字节码时,您是绝对正确的。 Scala 可用于并发的大多数库和框架也可用于 Java。然而,让 Scala 与众不同的是 Scala 的内置 对不变性的支持。 Scala 具有非常丰富的不可变集合,这种包含不可变性的特性使得为并发和并行应用程序编写代码变得更加容易。 Scala 将用户从编写线程级代码中抽象出来,让用户更多地关注业务逻辑。在此期间,Futures API 非常方便。
Scala 采用函数式编程范式(即组合函数)并在参与者中隔离可变状态,通过它您可以消除您可能遇到的所有典型并发问题,例如Java 中的编程线程。这就是为什么选择 Scala 作为设计 Spark 的语言。
现在谈到您的问题的主要部分,即与其他非功能语言相比,scala 如何利用更多内核:- Scala 中的 Futures API 有一个底层的执行上下文,它只不过是一个可由开发人员配置的线程池。使用此 API,您将能够利用所有内核。
【讨论】:
感谢@Chaitanya Waikar (+1),所以它听起来就像您在说 Scala 没有什么本质上的不同,它允许它比标准 Java 应用程序运行得更快,是的?再次感谢! @hotmeatballsoup Scala 采用函数式编程范式(即组合函数)并在参与者中隔离可变状态,您可以消除您可能遇到的所有典型并发问题,例如Java 中的编程线程。这就是为什么 Scala 是用于设计 Spark 的语言。 再次感谢@Chaitanya Waikar (+1),但要明确一点:Scala 与标准 Java 应用程序相比,运行速度更快并没有什么本质上的不同,对吧? @hotmeatballsoup 我没有数字可以评论 Java 和 Scala 应用程序的执行时间。但是,如果您坐下来编写相同的代码来实现并行性和并发性,那么与 Scala 相比,使用 Java 编写代码对开发人员来说变得非常棘手。 @hotmeatballsoup 你没抓住重点。 Odersky 并没有声称 Scala 代码比等效的 Java 代码更快,这太荒谬了。他提出了一个更站得住脚的说法,即并行代码比顺序代码更快(没有太大争议),并且它更容易用函数式语言编写并行代码。因此,Scala 比 Java 更快,因为不变性和更好的并发构造使得编写快速代码变得更加容易,而不是因为等效代码更快。【参考方案2】:我想在已经提到的内容中添加更多内容。我相信,总的来说,Java 应用程序比 Scala 应用程序更快但可以忽略不计。然而,仅靠快速的执行速度是不够的。例如,
我们能否比 Java 更快地开发 Scala 应用程序?关键是,即使 Scala 应用程序在执行速度方面慢了 10~15%(例如),但使用 FP 最佳实践开发时间快了~30%,那么使用 Scala(或其他函数式语言)是值得的)。 FP强调很多函数的可组合性和类型安全。 FP 的另一个特点是使用值(不可变变量)而不是变量。不变性使多核编程更易于管理且不易出错。 Java 可以使用一些 FP 最佳实践来做同样的事情。因此,在开发过程中,Java 程序员会遇到很多不便,因为这些做法在 Java 中并不容易实现。
编译 Java 源代码是否比 Scala 更快?嗯,这是一个很大的肯定。 Scala 编译器会检查很多东西,例如implicit
函数,在编译期间。然而,Scala 程序员编写的单元测试较少,因为编译器会检查函数参数和返回类型的有效性。如果类型没有正确对齐,编译器将中断。
Java 和 Scala 应用程序都编译成 JVM 字节码并在同一个 JVM 下执行的说法是错误的。这两个应用程序都受到 JVM 功能的限制,除非其中一个应用程序使用未记录的 JVM 功能。然后,该语言具有“不公平”的优势。考虑到这一点,在相同的 JVM 运行时环境下,一种语言比另一种更快的唯一方法是更有效地排列字节码。
【讨论】:
以上是关于与 Java 或其他非函数式语言相比,Scala 究竟如何利用更多内核?的主要内容,如果未能解决你的问题,请参考以下文章
Js Deferred/Promise/Future 与 Scala 等函数式语言相比