[Haskell-cafe] Small question
Stefan O'Rear
stefanor at cox.net
Fri Aug 10 03:05:40 EDT 2007
On Fri, Aug 10, 2007 at 07:26:28AM +0100, Andrew Coppin wrote:
> Stefan O'Rear wrote:
>> I like pretty pictures.
>
> ...and have lots of spare time, apparently. ;-)
Indeed. :)
>> Probably none. The STG-machine was designed to make user-defined
>> algebraic types very fast.
>
> My program needs to make decisions based on a pair of boolean values.
> Encoding both values as a single algebraic data type means I have to keep
> "taking it apart" so I can work with it. I'm not sure how much time this
> wastes...
Good point...
>> 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...)
>
> Well, perhaps I could define a pair of constants representing the bit
> masks? (OTOH, won't GHC optimise "testBit <constant>" into something faster
> anyway?)
Probably not; GHC has few rules for dealing with partial evaluation on
numeric arguments. Asking GHC itself:
stefan at stefans:/tmp$ ghc -c -ddump-simpl -O2 X.hs
==================== Tidy Core ====================
X.moo [NEVER Nothing] :: forall a_a82. GHC.Base.Int -> a_a82 -> a_a82 -> a_a82
[GlobalId]
[Arity 3
NoCafRefs
Str: DmdType U(L)LL]
X.moo =
\ (@ a_a88) (ix_a84 :: GHC.Base.Int) (ift_a85 :: a_a88) (iff_a86 :: a_a88) ->
case ix_a84 of wild_acF { GHC.Base.I# x#_acH ->
case Data.Bits.$w$s$dmbit 7 of ww1_acN { __DEFAULT ->
case GHC.Prim.word2Int#
(GHC.Prim.and# (GHC.Prim.int2Word# x#_acH) (GHC.Prim.int2Word# ww1_acN))
of wild1_acO {
__DEFAULT -> ift_a85; 0 -> iff_a86
}
}
}
==================== Tidy Core Rules ====================
stefan at stefans:/tmp$ cat X.hs
module X where
import Data.Bits
{-# NOINLINE moo #-}
-- ghc doesn't optimize functions that are deemed small enough for inlining;
-- this is a good thing (since when we inline we know more about the context
-- and can do a better job if we wait until then), but interferes with small
-- experiments like this
moo :: Int -> a -> a -> a
moo ix ift iff = if testBit ix 7 then ift else iff
stefan at stefans:/tmp$
The important bit is the (Data.Bits.$w$s$dmbit 7). Since that function
doesn't do IO (no realworld arguments), it could in theory be evaluated
at compile time (and judging from context it almost surely evaluates to
128#), but it hasn't been.
> Like that time yesterday, I compiled from program and got a weird message
> about GHC about "ignored trigraphs" or something... What the heck is a
> trigraph?
Everyone's favorite obscure feature of the ANSI C99 preprocessor.
Probably you had something like "this is odd???" in your source code,
and were using -cpp.
http://www.vmunix.com/~gabor/c/draft.html#5.2.1.1
> (I compiled the program again later, and it compiled just fine. Weird...)
>> Good idea! Maybe it could be fit into the GHC Performance Resource
>> somehow? (http://www.haskell.org/haskellwiki/Performance/GHC)
>
> OK. But it'll probably contain a lot of guessing to start with... ;-)
Wiki pages can be fixed. Private misunderstandings can't, at least not
anywhere near as easily.
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/20070810/8f81494a/attachment.bin
More information about the Haskell-Cafe
mailing list