Superb; on how to avoid boxing. On Tue, Jun 14, 2011 at 7:51 AM, Daniel Fischer <daniel.is.fisc...@googlemail.com> wrote: > On Tuesday 14 June 2011, 15:51:57, Daniel Fischer wrote: >> On Tuesday 14 June 2011, 14:35:19, Johannes Waldmann wrote: > >> >> With id, main1 jumps to foldb_cap, which contains a lot of code for the >> (cap > 1)-branch, and - that's what causes the slowdown - a worker loop >> >> $s$wfoldlM'_loop_s3EE [Occ=LoopBreaker] >> >> :: GHC.Prim.Int# >> >> -> (GHC.Types.Int, GHC.Types.Int) >> -> (# GHC.Types.Int, GHC.Types.Int #) >> >> which uses the passed functions (thus you have no inlining of eff and >> h1, and a boxed tuple of boxed Int's in your worker). >> >> > I am sure GHC headquarters will look at this when they find the time >> > but perhaps there's some additional knowledge on this mailing list >> > that might help. > > Note that you get good behaviour when you help GHC a bit, in particular a > static argument transformation for the function parameters of foldb_cap > allows them to be inlined and (in this case) you get the nice loop on > unboxed Int#s again: > > > foldb_cap :: ( V.Unbox a, V.Unbox b ) > => Int > -> b > -> ( a -> b ) > -> ( b -> b -> b ) > -> Vector a > -> b > foldb_cap cp strt f g xs = work cp strt xs > where > work cap e s = > if cap <= 1 > then V.foldl' g e $ V.map f s > -- replace "id" by "undefined" in the following, > -- and notice a drastic decrease in runtime - > -- although this branch is never executed: > else id $ case V.length s of > 0 -> e > 1 -> f $! V.head s > n -> let splitAt k v = > ( V.take k v, V.drop k v ) > ( s1, s2 ) = splitAt ( div n 2 ) s > cap' = div cap 2 > v1 = work cap' e s1 > v2 = work cap' e s2 > v = g v1 v2 > in par v1 $ pseq v2 $ v > > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe >
-- -- Regards, KC _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe