Solving the containers INLINE issue

Milan Straka fox at ucw.cz
Fri Sep 24 07:00:19 EDT 2010


Hi,

I suggest following variants for solving INLINE containers issues.
This solution will be short-term only, the long-term one will probably
go in the way of being able to specialize INLINABLE functions.

a) remove all INLINEs
  - smallest code
  - up to 50% worse 
  - the numbers are in one of my previous mail

b) leave all INLINEs
  - biggest code
  - fastest
  - numbers are in one of my previous mail

c) remove all INLINEs, but leave small amount of reasonable INLINEs
  - on functions needing Ord, ie. Map and Set
  - on 'small' functions only -- member, notMember, lookup*, insert*,
    delete*, alter*, update*, adjust* and fold*
  - set balance, balanceL and balanceR as NOINLINE (otherwise they
    get inlined in insert*, making them too big)

  - smaller code bloat
    - ghc binary is 1.4% larger than a) instead of 3.8% (which is
        the amount b) is larger than a))
    - map-properties test is 0.4% larger instead of 126%
    - Map benchmark is actually 0.2% smaller (probably because of
      balanceL and balanceR not inlining to insert)

  - reasonable performance. Here is the speedup of c) against b),
    measured in % (+= several pct). 
alter                       2.73
delete                      3.01
difference                  3.76
insert                      -16.40
insertLookupWithKey empty   -1.60
insertLookupWithKey update  -2.32
insertLookupWithKey' empty  -8.39
insertLookupWithKey' update -15.75
insertWith empty            -16.04
insertWith update           -15.26
insertWith' empty           -17.13
insertWith' update          -14.67
insertWithKey empty         -15.35
insertWithKey update        -13.01
insertWithKey' empty        -17.09
insertWithKey' update       -16.81
intersection                -3.46
lookup                      2.73
lookupIndex                 0.52
union                       0.66
update                      3.28
updateLookupWithKey         -1.44

  The only penalty is 15% loss on insert because of not inlining
  balanceL and balanceR. But when doing so, the bloat is nearly as in b).


I vote for c) and have the patches ready.

If there are no major objections, I will push the patches in several hours.
(or should I do it sooner? Ian? Simon?)

Milan


More information about the Libraries mailing list