sev*_*evo 2 garbage-collection haskell ghc
有-S选项和简单的程序:
main = do
print "Hello"
main
Run Code Online (Sandbox Code Playgroud)
我可以看到它产生了一些垃圾:
[...]
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
[...]
Run Code Online (Sandbox Code Playgroud)
但删除后print显然没有.是否有可用于编写无GC程序的无库存核心库子集?
编辑:最近有关于线性类型的工作似乎有可能实现这样的功能.
您偶尔可以生成执行很少甚至没有垃圾收集的小程序.例如,以下程序:
main = print $ sum [(1::Int)..1000000000]
Run Code Online (Sandbox Code Playgroud)
如果编译时-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
Run Code Online (Sandbox Code Playgroud)
分配一个百万整数数组然后通过它运行999次反转所有元素.
使用GHC版本8.4.3进行编译,-O2它在开始时分配大约8个演出,但在运行列表反转时不进行任何额外分配.我的猜测是你可以实现一些有用的东西,比如就地快速排序,使用类似的技术而不进行任何分配,因此跳过任何GC.
但是,作为一般规则,分配是GHC编译的Haskell代码实际运行方式的基本部分,没有合理的库或编程技术子集可以保证无GC编程.
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |