GHC 是否支持无气相色谱编程?



使用-S选项和一个简单的程序:

main = do
print "Hello"
main

我可以看到它会产生一些垃圾:

[...]
1024232      4904     45992  0.000  0.000    0.428    0.530    0    0  (Gen:  1)
0                      0.000  0.000
1,242,080,056 bytes allocated in the heap
271,656 bytes copied during GC
[...] 

但是在删除print之后,它显然没有。是否有可用于编写无 GC 程序的无分配核心库子集?

编辑:最近也有关于线性类型的工作,似乎有可能启用这样的功能。

您偶尔可以生成执行很少或没有垃圾回收的小程序。 例如,以下程序:

main = print $ sum [(1::Int)..1000000000]

如果使用-O2编译,则应在不分配太多或执行任何值得一提的GC的情况下运行。

但是,这通常仅限于可以编译成具有"未装箱"数据类型(在本例中为未装箱Int#值(而没有代数数据结构的紧密循环的程序(在这种情况下,列表被融合不存在(。 有一组有限的更复杂的数据结构(例如,未装箱的Vector(,也可以在不分配的情况下进行操作,如果你非常小心,你也许能够编写在这样的结构上运行的算法而不分配太多。

例如,以下程序:

import Control.Monad
import qualified Data.Vector.Unboxed.Mutable as V
main :: IO ()
main = do
v <- V.new 1000000
forM_ [0..999999] $ i -> do
V.write v i i
replicateM_ 999 $
forM_ [0..499999] $ i -> do
V.swap v i (999999 - i)
print =<< V.read v 123

分配一个百万整数数组,然后运行 999 次反转所有元素。

使用 GHC 版本 8.4.3 编译,-O2开始时分配了大约 8 个演出,但在运行列表反转时不会进行任何额外的分配。 我的猜测是,您可以使用类似的技术实现一些有用的东西,例如就地快速排序,而无需进行任何分配,从而跳过任何 GC。

然而,作为一般规则,分配是GHC编译的Haskell代码实际运行方式的基本部分,没有合理的库子集或编程技术可以保证无GC编程。

相关内容

  • 没有找到相关文章

最新更新