OCaml功能正常,因此在许多情况下,所有数据都是不可变的,这意味着它不断创建新数据,或将数据复制到新内存等。
然而,它有着快速的声誉。
有很多关于OCaml的讨论总是说虽然它不断创造新事物,但它仍然很快。但我无法解释原因。
有人可以总结为什么即使用功能方式它也很快?
答案 0 :(得分:7)
此外,您应该知道副本的制作几乎不像您想象的那么频繁。只需更新不可变数据结构的已更改部分。例如,假设您有一个不可变集x
。然后,您将y
定义为x
,其中包含一个附加项。即使语义y
和x
是完全不同的集合,集合x
也会与y
共享其大部分基础表示。通常的参考是Okasaki的Purely Functional Data Structures。
答案 1 :(得分:5)
我认为,正如Jerry101所指出的那样,如果知道GC在一个几乎所有对象都是不可变且短命的环境中工作,那么你可以让GC更快。您可以使用世代收集器,实际上没有任何对象可以使用第一代。这非常快。
OCaml也具有可变值。对于某些情况(我希望它们在实践中很少见),您会发现使用可变性会使代码变慢,因为GC会针对不变性进行调整。
OCaml没有并发GC。这是一件很棒的事情。
另一个角度是OCaml实现者(Xavier Leroy等人)非常出色: - )
Real World OCaml书似乎对OCaml中的GC有很好的描述。这是我找到的链接:https://realworldocaml.org/v1/en/html/understanding-the-garbage-collector.html
答案 2 :(得分:1)
我不熟悉OCaml,但这里有一些关于编程语言VM(包括垃圾收集)速度的一般背景知识。
一个方面是深入研究声明 - “快速”与什么相比?
在一个比较中,摘要是“D比C ++慢,但D程序比C ++程序快”。 D中的微基准测试速度较慢,但在编程时更容易看到大图,因此使用更好的算法,避免重复工作,而不必解决C ++粗糙边缘问题。
另一个方面是要意识到现代垃圾收集器非常快,并发垃圾收集器可以在另一个线程中完成大部分工作,从而以节省“mutator”线程时间的方式使用多个CPU核心,并且GC环境中的内存分配比C malloc()
更快,因为它不必搜索合适的内存间隙。
功能语言也很容易并行化。