为什么OCaml在不断创造新事物的同时仍能快速合理?

时间:2014-03-17 21:54:06

标签: functional-programming ocaml

OCaml功能正常,因此在许多情况下,所有数据都是不可变的,这意味着它不断创建新数据,或将数据复制到新内存等。

然而,它有着快速的声誉。

有很多关于OCaml的讨论总是说虽然它不断创造新事物,但它仍然很快。但我无法解释原因。

有人可以总结为什么即使用功能方式它也很快?

3 个答案:

答案 0 :(得分:7)

此外,您应该知道副本的制作几乎不像您想象的那么频繁。只需更新不可变数据结构的已更改部分。例如,假设您有一个不可变集x。然后,您将y定义为x,其中包含一个附加项。即使语义yx是完全不同的集合,集合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()更快,因为它不必搜索合适的内存间隙。

功能语言也很容易并行化。