haskell - 在删除不透明的 FFI 对象之前,垃圾回收需要多长时间?有可能以某种方式加快速度吗?

标签 haskell garbage-collection ghc ffi

我考虑将 Haskell 绑定(bind)编写到用 C++(我会编写一个普通的 C 包装器)和 CUDA 编写的量子力学库。主要瓶颈始终是 CUDA 部分使用的 GPU 内存。在 C++ 中,处理起来非常高效,因为所有对象都有自动内存管理,即一旦离开作用域就会被删除。另外,我使用 C++11 移动语义来避免复制,无论如何,这些在 Haskell 中显然是不必要的。

然而,我担心当对象是从垃圾收集的 Haskell 管理时,它可能不再顺利工作,并且我可能需要想出启发法将很少使用的对象迁移回主机内存(这往往是相当慢)。这种担心是否合理,或者 GHC 垃圾收集是否如此有效,以至于大多数对象几乎会像 C++ 中一样快地消失,即使 Haskell 运行时认为它不需要节省内存?是否有任何技巧可以提供帮助,或者有什么方法可以表明某些对象占用了过多的 GPU 内存并应尽快删除?

最佳答案

even when the Haskell runtime doesn't see it needs to be economic on memory?

这就是问题所在:GHC GC 不知道您的异物有多大,因此它们不会施加任何堆压力,因此不会尽快收集。

您可以通过手动调用 performGC 强制执行主要 GC 来缓解此问题。

关于haskell - 在删除不透明的 FFI 对象之前,垃圾回收需要多长时间?有可能以某种方式加快速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10736780/

相关文章:

haskell - 文件 I/O 无法产生输出的困难

haskell - 具有给定顺序的无序数据类型集

Java gc - 什么是长生命周期对象?

java - 删除并重新创建数组或用零填充它是否更快,为什么?

haskell - Nix 上的 XMonad - 找不到 xmonad-contrib

haskell - 为什么这段代码在优化开启或关闭时表现不同?

list - 从元组列表中删除反向重复项

haskell - TimeOfDay 的任意实例

java - 如何在 Android 上启用详细 GC?

haskell - 使用沙箱时如何让 cabal 忽略全局包数据库