gpt4 book ai didi

haskell - GHC 支持无 GC 编程吗?

转载 作者:行者123 更新时间:2023-12-02 11:12:34 30 4
gpt4 key购买 nike

使用-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# 值)而无需代数数据结构(在本例中为该列表已融合不存在)。有一组有限的更复杂的数据结构(例如,未装箱的向量)也可以在不分配的情况下进行操作,如果您非常小心,您可能能够编写对此类进行操作的算法结构无需分配太多。

例如以下程序:

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 个 gig,但在运行列表反转时不会进行任何额外的分配。我的猜测是,您可以实现一些有用的东西,例如就地快速排序,使用类似的技术而不进行任何分配,从而跳过任何 GC。

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

关于haskell - GHC 支持无 GC 编程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51866287/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com