marlowsd: > Claus Reinke wrote: >>>> Here is a trivial example with drastic difference between >>>> T = Int and T = Word (~2.5x here): >>>> >>>> main = print $ foldl' (+) 0 [1..100000000::T] >> .. > >> A quick grep shows almost no specialization at all for Word, or for >> IntXX/WordXX (see below). Still, none of that seems to explain the >> example repeated at the top of this message. > > The Enum instance for Int uses specialised implementations of enumFromTo > and friends, whereas the Word version uses the generic > integralEnumFromTo.
Another good reason to use uvector, import Data.Array.Vector import Data.Word main = print $ foldlU (+) (0::T) (enumFromToU 1 (100000000::T)) type T = Word $wfold :: Word# -> Word# -> Word# $wfold = \ (ww_s1cg :: Word#) (ww1_s1ck :: Word#) -> case gtWord# ww1_s1ck __word 100000000 of wild_a19p { False -> $wfold (plusWord# ww_s1cg ww1_s1ck) (plusWord# ww1_s1ck __word 1); True -> ww_s1cg Yields: Main_zdwfold_info: .Lc1e1: cmpq $100000000,%rdi ja .Lc1e4 leaq 1(%rdi),%rax addq %rdi,%rsi movq %rax,%rdi jmp Main_zdwfold_info While at type T = Int We get: $wfold :: Int# -> Int# -> Int# $wfold = \ (ww_s144 :: Int#) (ww1_s148 :: Int#) -> case ># ww1_s148 100000000 of wild_a11q { False -> $wfold (+# ww_s144 ww1_s148) (+# ww1_s148 1); True -> ww_s144 And *identical assembly* Main_zdwfold_info: .Lc15E: cmpq $100000000,%rdi jg .Lc15H leaq 1(%rdi),%rax addq %rdi,%rsi movq %rax,%rdi jmp Main_zdwfold_info -- Don _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users