[Haskell-cafe] Small question

Stefan O'Rear stefanor at cox.net
Thu Aug 9 18:09:38 EDT 2007


On Thu, Aug 09, 2007 at 10:19:59PM +0100, Andrew Coppin wrote:
> Right. So a Bool is a 32 or 64 bit quantity. (Rather like Smalltalk...)
>
> That presumably means that a (Double,Double) is going to be a thunk that 
> evaluates to a (,) pointing to two thunks that evaluate to pointers... IOW, 
> something like 3 pointers' worth of space.

I like pretty pictures.

:           :                     +--------+
:           :                  /->| D# tag |
+-----------+    +---------+  /   +--------+    +--------+
| somewhere |--->| (,) tag |-/    | Value  | /->| D# tag |
+-----------+    +---------+      |        | |  +--------+
:           :    | fst     |      |        | |  | Value  |
:           :    +---------+      +--------+ |  |        |
                 | snd     |-----------------/  |        |
                 +---------+                    +--------+

That's how much space a (Double,Double) NF uses.


> Whereas my Quad object is going 
> to be a pointer to one of 4 values... so it looks like Quads save space. 
> (And they're more strict.) OTOH, I'm not sure what the time penalty is 
> like...

Probably none.  The STG-machine was designed to make user-defined
algebraic types very fast.

> It would be nice if there were some general mechanism for turning a bunch 
> of Bool flags into a single machine word. E.g., if I did a
>
>  data Foo = Foo {flagX, flagY, flagZ :: !Bool}
>
> and it ends up that a Foo value is just a single machine word, and GHC 
> picks which bit each flag is... I guess if you want that at present you'd 
> have to code it all by hand. Hmm, I think this might work out better than 
> my current Quad thing... I could do something like
>
>  type Quad = Word8
>
>  foo q = let
>    x = if testBit 0 q ...
>    y = if testBit 1 q ...
>
> That should be quite fast... (?)

Probably. I wound up doing something similar with vty, to considerable
gain.  (I did however use .&. instead of testBit - probably makes no
difference, but I'm reminded of the (^2) being much slower than join(*)
case...)

>>> (Questions, questions, so many questions...)
>>
>> I like answering them. :)
>
> Heh. I'll have to pester you more often. :-P

:)

> PS. Somewhere they should write a page entitled "Optimisations that GHC 
> does (and doesn't) do"...

Good idea!  Maybe it could be fit into the GHC Performance Resource
somehow?  (http://www.haskell.org/haskellwiki/Performance/GHC)

> PPS. Hmm. Might be out of date fast? ;-)

That's what wikis are for :)

Stefan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20070809/a396ab8d/attachment.bin


More information about the Haskell-Cafe mailing list