Haskell GHC是否支持无GC编程?
使用Haskell GHC是否支持无GC编程?,haskell,garbage-collection,ghc,Haskell,Garbage Collection,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
-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
后,它显然没有。是否有一个无alloc的核心库子集可用于编写无GC程序
编辑:最近也有关于线性类型的工作,似乎有可能启用这种功能。您偶尔可以生成执行很少或没有垃圾收集的小程序。例如,以下程序:
main = print $ sum [(1::Int)..1000000000]
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
如果使用-O2
编译,则应在不分配太多或执行任何值得一提的GC的情况下运行
但是,这通常仅限于那些可以编译成具有“unbox”数据类型(在本例中为unboxInt
值)且没有代数数据结构(在本例中,该列表已不存在)的紧循环的程序。有一组有限的更复杂的数据结构(例如,未装箱的向量
s)也可以在不分配的情况下进行操作,如果您非常小心,您可能能够编写在此类结构上运行的算法,而无需分配太多
例如,以下程序:
main = print $ sum [(1::Int)..1000000000]
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
import-Control.Monad
将限定的Data.Vector.unbox.Mutable导入为V
main::IO()
main=do
v do
写
复制项目uu999$
表格[0..499999]$\i->do
V.swap V i(999999-i)
print=我相信唯一诚实的答案是否定的,你不能在Haskell中写任何非平凡的东西而不引起GC。不过,您现在可以拥有,即内存中的区域将没有GC。