[GHC] #15642: Improve the worst case performance of weak pointers

GHC ghc-devs at haskell.org
Fri Sep 14 02:46:58 UTC 2018


#15642: Improve the worst case performance of weak pointers
-------------------------------------+-------------------------------------
           Reporter:  dfeuer         |             Owner:  (none)
               Type:  feature        |            Status:  new
  request                            |
           Priority:  normal         |         Milestone:  8.8.1
          Component:  Runtime        |           Version:  8.6.1-beta1
  System                             |
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Runtime
  Unknown/Multiple                   |  performance bug
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Garbage collecting weak pointers involves repeatedly traversing the weak
 pointer list, checking which keys are still alive, and in response marking
 the relevant values and finalizers live. This works well in most cases,
 but if there are long chains of weak pointers, it's terrible. I wonder if
 we can do something about that without significantly hurting performance
 elsewhere. Here's the (probably naive) idea:

 1. Maintain a hash table mapping weak pointer keys to lists of weak
 pointers. This replaces the current weak pointer list.

 2. Use a bit in the info table pointer of every heap object to indicate
 whether that object is referenced from any `Weak#`. This is the weakest
 link: if we don't have a spare bit there, or don't want to use one, then I
 think this whole idea is sunk.

 When creating a weak pointer, set the appropriate bit in the key and
 insert the key and pointer into the hash table. When performing early
 finalization, clear the bit in the key if no other `Weak#` points to it.

 When performing garbage collection: check the bit in each object as it is
 marked. If the bit is set, move the key and its attached `Weak#`s from the
 hash table into a new hash table (or an association list that gets turned
 into a hash table after evacuation or whatever), and mark all the linked
 weak pointer targets and finalizers live. In the end, the old hash table
 contains only unreachable objects. Now mark those objects live (for
 finalization and in case of resurrection), and queue up the finalizers.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15642>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list