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æš‚åœï¼Ÿ
ç”案 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。请评论我碰巧ä¸æ£ç¡®çš„事情。 :)