Bools are not unboxed

Tomasz Zielonka t.zielonka at students.mimuw.edu.pl
Sun Oct 3 12:24:56 EDT 2004


On Sun, Oct 03, 2004 at 04:03:55PM +0200, Carsten Schultz wrote:
> Hi Tomasz!

Hi Carsten!

> > To my surprise, it was much slower and made many allocations:
> [...
> > Then I noticed the cause: 
> >     GHC.Prim.<# returns a boxed, heap allocated Bool, and so do other
> >     primitive comparison operators.

I should have asked one fundamental question first: am I right? ;)

> That's not really the cause.  A function returning a boxed value does
> not necessarily have to allocate it, it is just a vectored return
> afaik.

I haven't heard about 'vectored return' before. I will try to find
more information about it. Maybe you can recommend something for me
to read?

> (Notice that $wfor again take three arguments, the last one being the
> state.)

Hmmm, I noticed that the number of arguments differed, there were even
some quiet alarm bells in my head, but I ignored it.

> for4 :: Int -> IO () -> IO ()
> for4 n x = if n `gt` 0 == 0 then return () else x >> (for4 (n-1) x)
> 
> gt :: Int -> Int -> Int
> gt x y = if x > y then 1 else 0
> 
> If you test it, it should be fast.

It is even slightly faster than my fastest version :)

> BTW, although counting upwards (and not solving the problem
> generally), the following is ok too:
> 
> for2 :: Int -> IO () -> IO ()
> for2 n x = sequence_ [x | i <- [1..n]]

This one is amazing. It's 3 times faster than the previous one in spite
of being written in high level style.

I guess it's worth checking idiomatic Haskell style first, because there
is a big chance that GHC was optimised for it :)

However, it would be nice if all versions were as efficient... 

> Playing with the code generated by ghc is a great way to waste time
> for me.

Well, but you seem to be very good at it. Maybe it won't be such a waste
of time in the long term :)

> Wait until you have found the RULES-pragma :-)

I've already found it some time ago. I even tried to use them to
optimise vector/matrix expressions (to eliminate intermediate vectors),
but I remember that sometimes the rules didn't fire and I didn't
understand why.

> Have fun,
> 
> Carsten

Hope this will teach me to avoid premature conclusions :-/

Thanks,
Tom

-- 
.signature: Too many levels of symbolic links


More information about the Glasgow-haskell-users mailing list