bulat.ziganshin: > Hello Andrew, > > Tuesday, May 20, 2008, 11:05:52 PM, you wrote: > > >> -funbox-strict-fields. > >> > > > I did try that, but it didn't seem to make any difference for me. [Maybe > > it may be that ghc just not recompiled program when you supplied this > switch. as i wrote, this switch by itself made your original program > 1.5x faster on my box. try to delete .o/.exe before rebuilding > > and, without this switch representation for !Int32 is the same as for > Int32 - only difference is that when data is assigned to such field > they are evaluated first (and then boxed) > > it is not enabled by default, because for *non-primitive* datatypes > such as B below automatic unboxing of strict fields of this type may > decrease sharing and thus memory/performance. imagine for example: > > data A = A !B !B > data B = B !Int !Int !Int !Int !Int > > b = B 1 1 1 1 1 > a = A b b > > jhc automatically unboxes strict fields of primitive datatypes, which > is guaranteed to provide only positive effects. may be somesay the > same will be added to ghc
I'm confused. GHC of course unboxes strict fields of primitive data types. {-# OPTIONS -O2 -fvia-C -optc-O2 -funbox-strict-fields #-} data A = A !B !B data B = B !Int !Int !Int !Int !Int b = B 1 2 3 4 5 a = A b b go :: Int -> A go 0 = a go n = go (n-1) main = print $ case go 10 of A (B a b c d e) (B a' b' c' d' e') -> a + b + c + d + e + a' + b' + c' + d' + e' For example, go compiles to: $wgo :: Int# -> (# Int#, Int#, Int#, Int#, Int#, Int#, Int#, Int#, Int#, Int# #) $wgo = \ (ww_svf :: Int#) -> case ww_svf of ds_Xmw { __DEFAULT -> $wgo (-# ds_Xmw 1); 0 -> (# 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 #) Values are passed in registers, the structures are entirely unpacked into registers or stack for return. Were you not aware of this Bulat? -- Don _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe