[Haskell-cafe] Dead else branch does influence runtime?

KC kc1956 at gmail.com
Tue Jun 14 17:09:35 CEST 2011


Superb; on how to avoid boxing.

On Tue, Jun 14, 2011 at 7:51 AM, Daniel Fischer
<daniel.is.fischer at 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



-- 
--
Regards,
KC



More information about the Haskell-Cafe mailing list