gpt4 book ai didi

scala - Scala 创建不可变对象(immutable对象)的成本

转载 作者:行者123 更新时间:2023-12-01 08:28:25 24 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

7年前关闭。




Improve this question




我在 [1] 中看到了类似 for-comprehension 的帖子,这真的让我想知道使用不可变 Map 与 Mutable 的总体含义是什么。似乎 Scala 开发人员对允许不可变数据结构的突变以产生新对象的成本非常满意——或者我可能只是遗漏了一些东西。如果不可变数据结构上的每个突变操作都返回一个新实例,虽然我知道这对线程安全有好处,但是如果我知道如何微调我的可变对象以做出同样的保证呢?

[1] In Scala, how can I do the equivalent of an SQL SUM and GROUP BY?

最佳答案

一般来说,回答这类性能问题的唯一方法是在你的真实代码中分析它们。微基准通常会产生误导(参见例如 this benchmarking tale ) - 特别是如果您谈论的是并发,最佳策略可能会因您的用例在实践中的并发程度而大不相同。

理论上,足够智能的编译器™ 应该能够——也许在线性类型系统(推断或其他方式)的帮助下——重现可变数据结构的所有效率优势。事实上,由于它有更多关于程序员意图的可用信息,并且较少受到程序员必须指定的附带细节的约束,因此这样的编译器应该能够生成更高性能的代码 - 例如。 GCC 将代码重写为不可变形式 (SSA) 以进行优化。举一个更贴近家庭的例子,许多现实世界的 Java 程序具有完全足够的吞吐量,但由于 Java 的垃圾收集器停止世界以压缩堆而导致​​延迟问题。意识到某些对象是不可变的 JVM 将能够在不停止世界的情况下移动它们(您可以简单地复制对象,更新对它的所有引用,然后删除旧副本,因为如果某些线程无关紧要看到旧版本,而其中一些看到新版本)。

在实践中,这取决于,唯一的方法是对您的具体案例进行基准测试。根据我的经验,对于可用于解决大多数实际业务问题的程序员时间投入水平,在(不可变的)Scala 版本上花费 x 小时往往会比在可变的 Scala 或 Java 版本上花费相同的时间产生更高性能的程序 -事实上,在编写一个性能可接受的 Scala 版本所花费的程序员时间中,可能根本不可能完成一个 Java 版本(特别是如果我们需要相同的缺陷率)。另一方面,如果您有无限的专家级程序员时间可用并且需要尽可能获得最佳性能,您可能希望使用一种非常低级的可变语言(这就是 LAPACK 仍然用 Fortran 编写的原因)——甚至正如摩根大通最近所做的那样,直接在 FPGA 上实现您的算法。

但是即使在这种情况下,您也可能希望拥有一个使用高级语言的原型(prototype),以便您可以编写测试并比较两者,以确认高性能实现是否正常工作。特别是如果我们只是在讨论 Scala 中的可变与不可变,过早优化是万恶之源。编写您的程序,然后如果性能不足,请对其进行分析并查看热点。如果你真的花太多时间复制一个不可变的数据结构,那是一个合适的时间用可变版本替换它,并仔细检查线程安全保证。如果您正在编写正确解耦的代码,那么在需要时更换对性能至关重要的部分应该很容易,并且在此之前,您可以获得更简单、更容易推理的代码的开发时间 yield (特别是在并发例)。以我的经验,编写良好的代码中出现性能问题的可能性比人们预期的要小得多。大多数软件性能问题是由于算法或数据结构选择不当造成的,而不是这种小的开销。

关于scala - Scala 创建不可变对象(immutable对象)的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27316214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com