[Haskell-cafe] Announce: EnumMap-0.0.1

Job Vranish jvranish at gmail.com
Sun Aug 9 14:44:41 EDT 2009


 Inlining natFromInt and intFromNat improves things considerably.

Using Thomas DuBuisson's benchmarking code (with a larger number of keys):

IntMap:
buildMap:    12.2
lookupMap:    2.7

Original EnumMap:
buildMap:    13.0s
lookupMap:    3.6s

EnumMap built with -O2 (not sure the implications of building libraries with
-O2)
buildMap:    12.9s
lookupMap:    2.7s

  effectively the same time for inserts compared with the original EnumMap
  improved performance for lookups (effectivly the same as IntMap)

EnumMap built with -O2, inline on natFromInt and intFromNat and specialize
for insert, and join:
   (doesn't appear to get a speedup with specialize on lookup and lookupN if
EnumMap is built with -O2)
buildMap:    12.2s
lookupMap:    2.7s

  The same performance as IntMap!

I'm kinda dissapointed ghc can't figure this out automatically,
fromEnum/toEnum for Ints is just id.
Oh well, a few more annotations in the library and wouldn't see any reason
why EnumMap would be slower that IntMap. I'll submit a patch

I also tried EnumMap but with a newtyped Int for the keys. I get the same
performance for lookups as Int, but the inserts are slower.
buildMap:    12.8s
lookupMap:    2.7s

My guess is that the specialize pragma on insert isn't getting triggered on
the newtype (which I think it should)
So I have a suggestion for a ghc optimization: Unwrap newtypes before
specialization so that the specializer can take advantage of the underlying
type.

- Job



On Sun, Aug 9, 2009 at 12:08 AM, Thomas DuBuisson <
thomas.dubuisson at gmail.com> wrote:

> Inflating the number of elements in the test, I see:
>
> IntMap
> inserts: 5.3 seconds
> lookups: 2.0 seconds
>
> EnumMap
> inserts: 6.1 sec (15% slower)
> lookups: 2.5 sec (25% slower)
>
> EnumMap with SPECIALIZE of:
> {-# SPECIALIZE join :: Prefix -> EnumMap Int a -> Prefix -> EnumMap
> Int a -> EnumMap Int a #-}
> {-# SPECIALIZE lookup :: Int -> EnumMap Int a -> Maybe a #-}
> {-# SPECIALIZE lookupN :: Nat -> EnumMap Int a -> Maybe a #-}
> {-# SPECIALIZE insert :: Int -> a -> EnumMap Int a -> EnumMap Int a #-}
> inserts: 5.3 seconds (dead on)
> lookups: 2.6 seconds (owch!)
>
> Additionally specializing the functions used in lookup{,N} doesn't
> help.  I tried inlining (via INLINE) a couple things but that only
> made performance notably worse.
>
>
> Thomas
>
> On Sat, Aug 8, 2009 at 8:29 PM, John Van Enk<vanenkj at gmail.com> wrote:
> > How bad is the lookup compared to normal?
> >
> > On Sat, Aug 8, 2009 at 9:02 PM, Thomas
> > DuBuisson<thomas.dubuisson at gmail.com> wrote:
> >> On Sat, Aug 8, 2009 at 5:30 PM, Felipe Lessa<felipe.lessa at gmail.com>
> wrote:
> >>> On Sat, Aug 08, 2009 at 04:14:15PM -0700, Thomas DuBuisson wrote:
> >>>> There exists a small but measurable performance hit for at least one
> >>>> test case (using Int as keys, obviously).  Perhaps the bias would be
> >>>> the other way if we were comparing EnumMap to an IntMap wrapped with
> >>>> to/from Enum.
> >>>
> >>> Perhaps some SPECIALIZE pragmas would help here.
> >>>
> >>
> >> Actually I tried that by adding SPECIALIZE to insert, insertN and
> >> lookup.  it seemed to make the insert benchmark competitive but not
> >> lookup.
> >>
> >> Thomas
> >> _______________________________________________
> >> Haskell-Cafe mailing list
> >> Haskell-Cafe at haskell.org
> >> http://www.haskell.org/mailman/listinfo/haskell-cafe
> >>
> >
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090809/13ac48ae/attachment.html


More information about the Haskell-Cafe mailing list