On Fri, 2007-10-12 at 20:25 -0700, Stefan O'Rear wrote:
> On Sat, Oct 13, 2007 at 12:09:57AM +0200, ntupel wrote:
> > setup :: (Ord a, IArray a2 a, IArray a1 e, Num a) => [e] -> [a] -> (a1 Int 
> > e, a1 Int e, a2 Int a)
> > calcAlias :: (Ord e, Num e, IArray a e, Ix i, IArray a2 e1, IArray a1 e1) 
> > => a2 i e1 -> a1 i e1 -> a i e -> [i] -> [i] -> (a1 i e1, a i e)
> > next :: (IArray a2 e1, IArray a e1, Ord e, IArray a1 e, RandomGen t, Random 
> > e) => (a Int e1, a2 Int e1, a1 Int e) -> t -> (e1, t)
> > randomList :: (Random e, RandomGen t1, IArray a2 e, Ord e, IArray a t, 
> > IArray a1 t) => (a Int t, a1 Int t, a2 Int e) -> t1 -> [t]
> 
...
> I would try specializing to StdGen, UArray, and Int, for RandomGen,
> IArray, and Random respectively.


Thanks for your reply Stefan. Unfortunately I could measure only a
relatively small improvement by changing to concrete types, e.g. using

setup :: [a] -> [Double] -> (Array Int a, Array Int a, UArray Int
Double)

calcAlias :: Array Int a -> Array Int a -> UArray Int Double -> [Int] ->
[Int] -> (Array Int a, UArray Int Double)

next :: (Array Int a, Array Int a, UArray Int Double) -> StdGen -> (a,
StdGen)

randomList :: (Array Int a, Array Int a, UArray Int Double) -> StdGen ->
[a]

the sample code was about one second faster when compiled with -O2.
Profiling again indicated that most time was spend in random and randomR
(I manually added cost centers into "next"):

           main +RTS -p -RTS

        total time  =        8.00 secs   (160 ticks @ 50 ms)
        total alloc = 2,430,585,728 bytes  (excludes profiling overheads)

COST CENTRE                    MODULE               %time %alloc

random                         Random                60.0   54.5
randomR                        Random                20.0   23.3
next                           Random                17.5   17.0
main                           Main                   1.9    2.5
randomList                     Random                 0.6    2.8


previously (i.e. with long class contexts) it looked like this:


           main +RTS -p -RTS

        total time  =        7.85 secs   (157 ticks @ 50 ms)
        total alloc = 2,442,579,716 bytes  (excludes profiling overheads)

COST CENTRE                    MODULE               %time %alloc

random                         Random                58.6   54.5
randomR                        Random                22.9   23.3
next                           Random                14.6   16.5
main                           Main                   2.5    2.5
randomList                     Random                 1.3    3.1


Many thanks again,
Thoralf


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to