什么是 F# 尾调用?为什么它比 C# 有性能提升?

What is an F# tail call? Why is it a performance boost over C#?

This article 阐述了 F# 的性能有时优于 C# 的一些原因。它在 "Firstly" 部分中说只有 F# 生成尾调用。

这到底是什么意思?为什么它会提升性能?对于我的国际象棋应用程序,这件事实际上可能决定 F# 和 C# 之间的关系,它使用了大量的递归。

性能更多地取决于您实现程序的方式,而不是语言。 F# 可能会为某些事情生成更好的 IL,而 C# 编译器对其他事情会更好。选择语言时,您应该考虑其他因素,而不仅仅是性能。

如果您正在编写国际象棋程序来学习 F#,请尝试一下,它是一种很棒的语言,只是不要仅仅因为您使用的是函数式语言就期望超级快的程序。


编辑以回答新问题:

F# 编译器确实会生成具有 tail. 操作码的 IL,而 C# 编译器则没有。这本身并不能使 F# 比 C# 更快或更高效,正如您在我上面的原始答案中看到的那样,但确实可以对您的特定国际象棋应用程序产生影响,因为您说递归被大量使用。

附带说明一下,CLR 可能会在运行时生成一些更简单的尾调用优化,因此对于 x64 环境中更简单的函数,即使是 C# 编译器生成的 IL 也可能具有尾调用优化。