F# 和 C# 之间互操作的 GC
GC for interop between F# and C#
在对函数式语言和垃圾收集进行了一些搜索之后,我发现普通命令式语言(如 Java、C#)的 GC 设计与函数式语言的 GC 有很大不同,如 Haskell.
这对我来说并不奇怪,因为我知道在函数式语言中改变变量状态的唯一方法是根据以前的对象创建新对象一个,然后销毁它,这将导致大量垃圾。
我很好奇的是,如果 dotnet 项目同时使用 C# 和 F#,那么 GC 将如何工作?我认为 F# 的代码会产生大量的垃圾,这可能很难用 C# 的普通 GC 处理。
所有 .NET 目标语言最终都会编译成 IL 并在同一运行时执行。
GC 是托管语言工作方式的重要组成部分。
然而,垃圾收集在函数式编程范例中并不一定更糟糕。大多数对象在第 0 代中被回收,并且永远不会进入第 1 代。
您在分配中付出的代价会在线程安全、并行性和优化方面得到回报。
当然,没有规定突变是非法的。
F# 是一种多范式语言,您仍然可以编写
在需要的地方执行命令式代码,事实上,几个核心库函数都是用这种方式编写的。
let mutable sum = 0
for i in 0..9 do
sum <- sum + i
你的问题的其他部分已经得到解答,所以我将重点关注这一部分:
What I've got curious is, if dotnet project uses both C# and F#, then how will the GC work? I think that the code from F# will generate super many garbages, which would maybe hard to handle with normal GC of C#.
这是一个值得考虑的有趣问题,但这个问题的基础是两个假设:
- 典型的 F# 程序产生的垃圾明显多于典型的 C# 程序,以至于产生了明显的差异
- .NET GC 难以处理典型 F# 程序生成的垃圾量
两者都是不真实的。您当然可以用两种语言编写非典型程序,这将压倒 .NET GC——尽管您可能会发现它比您最初想象的要困难得多——所以更多的问题是您使用 F# 无意中进入该位置的频率如何与 C# 相比。
我认为这一点研究得不多。 F# 在金融和分析建模领域的使用非常频繁,在这些领域资源利用率很重要。它还越来越多地用于 Web 服务和云开发,其中花费在 GC 上的长时间 运行 过程很重要。但是没有太多数据可以表明,与 C# 相比,F# 对于这些场景不符合标准,或者它的性能还不错。我倾向于说它足以应对这些场景,仅根据 number and type of bugs filed on the language.
来判断
此外,从 F# 4.5 开始,使用 Span<'T>
、byref
之类的结构、指针类型和相应的程序编译器分析,增加了低级、零分配编程的功能,这些程序使用他们。这些对于 F# 用法也是非典型的,但对于性能敏感的场景,它们使语言真正闪耀。把这当作一粒盐,但 Language Benchmarks Game 上的一些基准表明性能不是什么大问题。
在对函数式语言和垃圾收集进行了一些搜索之后,我发现普通命令式语言(如 Java、C#)的 GC 设计与函数式语言的 GC 有很大不同,如 Haskell.
这对我来说并不奇怪,因为我知道在函数式语言中改变变量状态的唯一方法是根据以前的对象创建新对象一个,然后销毁它,这将导致大量垃圾。
我很好奇的是,如果 dotnet 项目同时使用 C# 和 F#,那么 GC 将如何工作?我认为 F# 的代码会产生大量的垃圾,这可能很难用 C# 的普通 GC 处理。
所有 .NET 目标语言最终都会编译成 IL 并在同一运行时执行。
GC 是托管语言工作方式的重要组成部分。 然而,垃圾收集在函数式编程范例中并不一定更糟糕。大多数对象在第 0 代中被回收,并且永远不会进入第 1 代。
您在分配中付出的代价会在线程安全、并行性和优化方面得到回报。
当然,没有规定突变是非法的。 F# 是一种多范式语言,您仍然可以编写 在需要的地方执行命令式代码,事实上,几个核心库函数都是用这种方式编写的。
let mutable sum = 0
for i in 0..9 do
sum <- sum + i
你的问题的其他部分已经得到解答,所以我将重点关注这一部分:
What I've got curious is, if dotnet project uses both C# and F#, then how will the GC work? I think that the code from F# will generate super many garbages, which would maybe hard to handle with normal GC of C#.
这是一个值得考虑的有趣问题,但这个问题的基础是两个假设:
- 典型的 F# 程序产生的垃圾明显多于典型的 C# 程序,以至于产生了明显的差异
- .NET GC 难以处理典型 F# 程序生成的垃圾量
两者都是不真实的。您当然可以用两种语言编写非典型程序,这将压倒 .NET GC——尽管您可能会发现它比您最初想象的要困难得多——所以更多的问题是您使用 F# 无意中进入该位置的频率如何与 C# 相比。
我认为这一点研究得不多。 F# 在金融和分析建模领域的使用非常频繁,在这些领域资源利用率很重要。它还越来越多地用于 Web 服务和云开发,其中花费在 GC 上的长时间 运行 过程很重要。但是没有太多数据可以表明,与 C# 相比,F# 对于这些场景不符合标准,或者它的性能还不错。我倾向于说它足以应对这些场景,仅根据 number and type of bugs filed on the language.
来判断此外,从 F# 4.5 开始,使用 Span<'T>
、byref
之类的结构、指针类型和相应的程序编译器分析,增加了低级、零分配编程的功能,这些程序使用他们。这些对于 F# 用法也是非典型的,但对于性能敏感的场景,它们使语言真正闪耀。把这当作一粒盐,但 Language Benchmarks Game 上的一些基准表明性能不是什么大问题。