• A
    proc: Improve performance of loadMap on very large sparse maps · 89c8da65
    aarzilli 提交于
    Users can create sparse maps in two ways, either by:
    a) adding lots of entries to a map and then deleting most of them, or
    b) using the make(mapType, N) expression with a very large N
    
    When this happens reading the resulting map will be very slow
    because loadMap needs to scan many buckets for each entry it finds.
    
    Technically this is not a bug, the user just created a map that's
    very sparse and therefore very slow to read. However it's very
    annoying to have the debugger hang for several seconds when trying
    to read the local variables just because one of them (which you
    might not even be interested into) happens to be a very sparse map.
    
    There is an easy mitigation to this problem: not reading any
    additional buckets once we know that we have already read all
    entries of the map, or as many entries as we need to fulfill the
    MaxArrayValues parameter.
    
    Unfortunately this is mostly useless, a VLSM (Very Large Sparse Map)
    with a single entry will still be slow to access, because the single
    entry in the map could easily end up in the last bucket.
    
    The obvious solution to this problem is to set a limit to the
    number of buckets we read when loading a map. However there is no
    good way to set this limit.
    If we hardcode it there will be no way to print maps that are beyond
    whatever limit we pick.
    We could let users (or clients) specify it but the meaning of such
    knob would be arcane and they would have no way of picking a good
    value (because there is no objectively good value for it).
    
    The solution used in this commit is to set an arbirtray limit on
    the number of buckets we read but only when loadMap is invoked
    through API calls ListLocalVars and ListFunctionArgs. In this way
    `ListLocalVars` and `ListFunctionArgs` (which are often invoked
    automatically by GUI clients) remain fast even in presence of a
    VLSM, but the contents of the VLSM can still be inspected using
    `EvalVariable`.
    89c8da65
variables_test.go 54.9 KB