Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 函数式编程占用更多内存吗?_Memory_Functional Programming - Fatal编程技术网

Memory 函数式编程占用更多内存吗?

Memory 函数式编程占用更多内存吗?,memory,functional-programming,Memory,Functional Programming,警告!可能是个非常愚蠢的问题 函数式编程比过程式编程占用更多内存吗? 我是说。。。如果你的对象(数据结构)都是不可修改的。在给定的时间内,内存中不会有更多的对象 这不会占用更多的内存吗?这取决于你在做什么。使用函数式编程,您不必创建防御副本,因此对于某些问题,它最终可能会使用更少的内存 许多函数式编程语言对惰性也有很好的支持,这可以进一步减少内存使用,因为在实际使用对象之前不会创建对象。然而,这可以说只是与函数式编程相关,而不是直接原因。函数式语言鼓励但可以在命令式语言中实现的持久值,使得共享变

警告!可能是个非常愚蠢的问题

函数式编程比过程式编程占用更多内存吗? 我是说。。。如果你的对象(数据结构)都是不可修改的。在给定的时间内,内存中不会有更多的对象


这不会占用更多的内存吗?

这取决于你在做什么。使用函数式编程,您不必创建防御副本,因此对于某些问题,它最终可能会使用更少的内存


许多函数式编程语言对惰性也有很好的支持,这可以进一步减少内存使用,因为在实际使用对象之前不会创建对象。然而,这可以说只是与函数式编程相关,而不是直接原因。

函数式语言鼓励但可以在命令式语言中实现的持久值,使得共享变得更容易

尽管普遍接受的观点是,使用垃圾收集器,在任何给定时间都会有一定数量的浪费空间(已经无法访问但尚未收集的块),但在这种情况下,如果没有垃圾收集器,您通常会复制不可变且可以共享的值,只是因为决定谁负责在使用后释放内存太麻烦了


这些想法在一点上得到了扩展,其中不声称是一项客观的研究,而只是一些轶事证据。

除了避免程序员的防御性复制之外,这是一种非常聪明的纯函数式编程语言的实现,如Haskell或Standard ML(缺乏物理指针平等性)可以主动恢复内存中结构相等值的共享,例如作为内存管理和垃圾回收的一部分

因此,您可以使用编程语言运行时系统提供的自动哈希


将其与Java中的对象进行比较:对象标识是语言定义的一个组成部分。即使只是将一个不可变的
字符串
换成另一个字符串也会带来语义问题。

确实有一种倾向,认为内存是丰富的资源(事实上,在大多数情况下确实如此),但这一点适用于整个现代编程


由于有多个内核、并行垃圾收集器和千兆字节的可用RAM,人们过去常常专注于程序的不同方面,而在以前,每个字节都可以被计数。还记得比尔·盖茨说过“每个项目640K就足够了”吗

我认为这根本不是一个愚蠢的问题。我对函数式编程非常陌生,我认为这是一个有用的问题,可以帮助您了解函数式编程是如何工作的,您可以自己查看和决定。很难进行苹果对苹果的比较,但是JVM函数语言(Scala、Clojure)确实比普通Java使用更多的内存。但是,JVM不是正常情况。@Rafe Great link。有趣的是,尽管比Java差(Java已经是那些基准测试中内存使用率最差的之一),Scala并没有那么差。事实上,JRuby,一种也构建在JVM上的非功能性语言,比Scala或Clojure差得多。这类问题的答案通常是:它取决于所讨论的程序和实现。关于后者:在语言枪战中,Haskell完全没有易变性(除非被迫采取其他行动,否则它是完全不严格的)占用的内存比Java要少得多,对于大多数基准测试来说比C#Mono要少一些,因为GHC是一个地狱般的编译器。我对细节知之甚少,无法给出一个好的答案,但正如一条附加信息一样,函数式语言减少内存使用的一个重要方法是共享。如果您有一个大结构,然后返回一个修改了一小段的副本,两个大结构可以引用相同的值,只需要复制差异。这仅仅是因为值是纯值。对于惰性,在实际使用对象之前不会创建对象,但在决定创建对象之前,会将所有必要的参数保留在内存中。在很多情况下,这对你不利。@Pascal这是一个很好的观点。哪个更好取决于哪个更便宜:计算的输入或输出。@LaurenceGonsalves“防御副本”是什么意思?你能举个例子吗?我不习惯这个词。谢谢@GPrimola当您想要以只读方式访问可变值时,您需要创建一个防御副本,或者创建一个只读视图。它们都有各自的优缺点(例如,视图制作成本较低,但本质上不是线程安全的)。有很多页面都在谈论防御性复制。这里有一个:绝对不合理的论点。RAM始终是一种稀缺资源。你听说过矩阵吗?想象一个尺寸为1k x 1k,然后是1m x 1m的。你的GB还远远不够。请原谅,@sajid,但这不是一个道德判断,也不是一个浪费记忆是理性的说法。这只是对现实世界中发生的事情的描述。你和我可能不喜欢现在一个普通的网页是用兆字节来衡量的,但这只是现实。