é¿å…垃圾收集

时间:2013-11-24 13:03:46

标签: haskell garbage-collection

https://stackoverflow.com/a/15243682/944430

  

然åŽæœ‰ç¼–ç ï¼šä½¿ç”¨æœªè£…箱的类型(没有GC),最å°åŒ–惰性结构分é…。以包装形å¼ä¿å­˜é•¿å¯¿æ•°æ®ã€‚测试和基准测试。

1。)什么是未装箱的类型?我很确定他正在谈论数æ®ç±»åž‹ï¼Œä¾‹å¦‚Just x或IO y(盒装)。但是newtypes怎么样?如果我ç†è§£æ­£ç¡®ï¼Œnewtype根本没有开销,因此ä¸åº”该算作盒装类型?

2。)Keep long lived data around in packed form.是什么æ„æ€ï¼Ÿ

3.。)我还能åšäº›ä»€ä¹ˆæ¥é˜»æ­¢GCæš‚åœï¼Ÿ

2 个答案:

答案 0 :(得分:7)

1。 未装箱的类型是Haskell中的原语。例如,Int定义为:data Int = GHC.Types.I# GHC.Prim.Int#(对于GHC编译器)。尾部#符å·ç”¨äºŽè¡¨ç¤ºåŸºå…ƒï¼ˆè¿™åªæ˜¯çº¦å®šï¼‰ã€‚ Haskell中并ä¸å­˜åœ¨åŽŸå§‹æ•°æ®ã€‚您无法定义其他基元。当它们出现在代ç ä¸­æ—¶ï¼Œç¼–译器负责将它们转æ¢ä¸ºâ€œçœŸæ­£çš„â€å‡½æ•°è°ƒç”¨ï¼ˆå‡½æ•°ä¹Ÿå¯ä»¥æ˜¯åŽŸè¯­ï¼‰å’Œæ•°æ®ç±»åž‹ã€‚

是的,newtypeä¸ä¼šå¦å¤–“打包â€ç±»åž‹ã€‚但是你ä¸èƒ½æ‹¥æœ‰åŒ…å«åŽŸè¯­çš„新类型 - newtype Int2 = Int2 Int#无效,data Int2 = Int2 Int#没问题。

在您链接的问题的上下文中,原始类型和盒装类型之间的主è¦åŒºåˆ«åœ¨äºŽå®ƒä»¬åœ¨å†…存中的表示方å¼ã€‚原始类型æ„味ç€æ²¡æœ‰æŒ‡é’ˆå¯ä¾›éµå¾ªã€‚指å‘Int# 的指针必须指å‘数字的值,而指å‘Int的指针å¯èƒ½æŒ‡å‘指å‘thunkçš„thunk ...等。请注æ„,这æ„味ç€åŸºå…ƒå§‹ç»ˆæ˜¯ä¸¥æ ¼çš„。如果您认为这将是一个问题,请使用UNPACK编译指示,删除任何“中间â€è£…箱。也就是说,

data D = D (Int, Int)

作为指针(D)存储到指针(元组)到包å«ä¸¤ä¸ªæŒ‡é’ˆï¼ˆInts)的存储器å—,æ¯ä¸ªæŒ‡é’ˆæŒ‡å‘实际的Int#。然而,

data D = D {-# UNPACK #-} !(Int, Int)

作为指针(D)存储到两个Int,从而移除一级拳击。请注æ„!。这表明该字段是严格的,UNPACK是必需的。

2。任何将使用多æ€å‡½æ•°è°ƒç”¨çš„æ•°æ®éƒ½åº”该ä¿æŒæ‰“包状æ€ï¼Œå› ä¸ºä¼ é€’给多æ€å‡½æ•°çš„解包数æ®å°†è¢«é‡æ–°æ‰“包(引入ä¸å¿…è¦çš„开销)。ä¿æŒé•¿æœŸæ•°æ®æ‰“包的原因在于它更å¯èƒ½ç”¨äºŽéœ€è¦é‡æ–°æ‰“包的中间数æ®ç±»åž‹æˆ–函数,而使用短期数æ®æ›´å®¹æ˜“控制,这些数æ®ä»…在传递给少数函数之å‰ä¼ é€’给垃圾收集。

3。在99%的情况下,您ä¸ä¼šé‡åˆ°åžƒåœ¾æ”¶é›†å™¨æš‚åœçš„问题。通常,您无法ä¿è¯GCä¸ä¼šæš‚åœã€‚我唯一的建议是,ä¸è¦è¯•å›¾é‡æ–°å‘明轮å­ã€‚有一些库设计用于具有大é‡æ•°æ®ï¼ˆä¿®å¤ï¼ŒçŸ¢é‡ç­‰ï¼‰çš„高性能计算。如果你试图自己实现它,很å¯èƒ½ï¼Œå®ƒä»¬åšå¾—更好ï¼

答案 1 :(得分:2)

如果您定义data Int2 = Int,您å¯ä»¥è®¤ä¸ºInt#å·²å–消装箱,普通Int已装箱,Int2为“åŒç›’装â€ã€‚你使用newtype代替data,它会é¿å…一个间接。但是Int本身ä»ç„¶æ˜¯ç›’装的。因此,Int2也被加框。

至于packed form,没有详细说明,它直观地类似于这ç§C代ç ã€‚

struct PackedCoordinate {
   int x;
   int y;
}

struct UnpackedCoordinate {
   int *x;
   int *y;
}

我ä¸ç¡®å®šä¸ºä»€ä¹ˆä»–建议长期存在的数æ®æ˜¯æ‰“包形å¼çš„。无论如何,从我链接到的文档看æ¥ï¼Œåº”该å°å¿ƒä½¿ç”¨{-# UNPACK #-}编译指示,因为如果你è¿æ°”ä¸å¥½ï¼ŒGHCå¯èƒ½éœ€è¦åœ¨å‡½æ•°è°ƒç”¨ä¹‹å‰é‡æ–°æ‰“包它的值,这使得它分é…的内存比它更多如果它没有打开包装开始。

为了é¿å…垃圾收集。我认为你应该把它当作与分æžç›¸å…³çš„其他东西:在你的程åºä¸­æ‰¾åˆ°ç“¶é¢ˆï¼Œç„¶åŽåœ¨é‚£é‡Œå·¥ä½œã€‚


PS。请评论我碰巧ä¸æ­£ç¡®çš„事情。 :)